为什么java.lang.NullPointerException

Android 码拜 9年前 (2015-05-10) 1133次浏览 0个评论
 
public class MainActivity extends UserID {
	private Button btn;
	private EditText et1;
	private EditText et2;
	private TextView tv;
	private String dbpwd = null;
	private ArrayList<String> arraylist;

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		btn = (Button) findViewById(R.id.button1);
		et1 = (EditText) findViewById(R.id.editText1);
		et2 = (EditText) findViewById(R.id.editText2);
		tv = (TextView) findViewById(R.id.textView4);
		System.out.println("btn名称:" + btn.getId());
		System.out.println("已经获取view");
		btn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				System.out.println("View v" + v.toString());
				setclick();
			}
		});
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	private void setclick() {
		final String userid = et1.getText().toString();
		final String pwd = et2.getText().toString();
		System.out.println("输入的用户名为:" + userid + " 输入的密码为:" + pwd);
		if (userid != null && pwd != null) {
			System.out.println("已经判断输入框");
			new Thread() {
				public void run() {
					DBUtil dbu = new DBUtil();
					System.out.println("new DBUtil");
					arraylist = dbu.getInfo("emp", " where UserID = """ + userid
							+ """");
					System.out.println("arraylist.toString():"
							+ arraylist.toString());
				}
			}.start();
			if (arraylist.size() > 8) {
				dbpwd = arraylist.get(7);
				System.out.println("getInfo已经结束。返回ArrayList");
				System.out.println("数据库中的密码为:" + dbpwd);
				if (pwd.equals(dbpwd)) {
					setUserID(userid);
					System.out.println("页面跳转中......");
					Intent intent = new Intent(MainActivity.this,
							MenuActivity.class);
					startActivity(intent);
					// finish();//登陆成功后完全关闭此activity
				} else {
					tv.setText("密码错误");
					et2.setText("");
					System.out.println("密码错误");
					et2.setText("");
				}
			} else {
				System.out.println("请输入正确的用户名和密码");
				tv.setText("请输入正确的用户名");
				et1.setText("");
				et2.setText("");
			}
		} else {
			System.out.println("请输入正确的用户名和密码");
			tv.setText("请输入正确的用户名和密码");
			et1.setText("");
			et2.setText("");
		}
	}
}

为什么java.lang.NullPointerException

15分
arraylist是在new 的工作线程创建的
而arraylist.size是在主线程调用的,而且还是紧接着的。
有可能arraylist.size调用时,工作线程还未初始化完,所以空指针了
你看下代码第62行是不是arraylist.size
10分
public class MainActivity extends UserID

UserID是什么来的?

显示空指针的地方 tv已经赋值  这就奇怪了

10分
当你点击btn的时候,触发btn的监听事件。 这个时候 你的tv 还没有获取到控件。所以就 null了。解决方法:

第一种:
   将  tv = (TextView) findViewById(R.id.textView4);  放到 btn = (Button) findViewById(R.id.button1);   之前。

第二种:
   btn.setOnClickListener(new OnClickListener() {   
          @Override            
         public void onClick(View v) {                
                     System.out.println(“View v” + v.toString());      
                 tv = (TextView) findViewById(R.id.textView4);   
                        setclick();          
                     }        
                }); 

5分
引用 3 楼 u014081087 的回复:

当你点击btn的时候,触发btn的监听事件。 这个时候 你的tv 还没有获取到控件。所以就 null了。解决方法:

第一种:
   将  tv = (TextView) findViewById(R.id.textView4);  放到 btn = (Button) findViewById(R.id.button1);   之前。

第二种:
   btn.setOnClickListener(new OnClickListener() {   
          @Override            
         public void onClick(View v) {                
                     System.out.println(“View v” + v.toString());      
                 tv = (TextView) findViewById(R.id.textView4);   
                        setclick();          
                     }        
                }); 

代码执行顺序 从上往下  tv在 Button 设置监听之前

还有就是 在onCreate的时候 用户是不可见的吧


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明为什么java.lang.NullPointerException
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!