setOnClickListener报空指针异常

1.异常提示:



2.错误原因:

先看代码:

public class MainActivity extends ActionBarActivity {
	private Button btn_test;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		btn_test = (Button) findViewById(R.id.btn_test);

		setListener();
	}

	private void setListener() {
		btn_test.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				Toast.makeText(MainActivity.this, R.string.btn_text,
						Toast.LENGTH_SHORT).show();
			}
		});
	}

}

       在setListener方法中,发现报空指针异常的地方是setOnClickListener方法,刚開始的时候我百思不得其解。由于我的Button明明初始化成功。点击事件也有。为什么会在这个地方报空指针异常。后来认为可能是布局中的button可能有问题,可是进入setContentView中的activity_main布局,发现我的Button一切正常。id是对的。该有的属性设置也都有。这就奇怪了,后来我无意中发现,原来错误的原因是R.id.btn_test指向了另外一个布局,我在代码中Crtl+鼠标左键竟然是跳转到了另外一个无关的界面,可是这个界面中的一个Button的id和我activity_main界面的Button id是一样的,到这里,情况就非常清晰明了了。原来之所以setOnClickListener报空指针异常的原因居然是Button findViewById的时候指向了还有一个界面的Button,当前界面的Button并没有被初始化。所以报了空指针异常;

       更常见的情况是大家在写布局的时候忘了给对应布局的Button设置id。结果在findViewById的时候自然会指向其它布局。导致异常出现。


3.解决的方法:

        既然知道了错误原因,那么解决这个异常就非常好办了,仅仅要把这两个界面的Button设置为不同样的就可以(或者给对应xml界面中的Button设置好Id)。在这里要提醒大家,最好不要在app 开发中使用同样的id,免得出现一些意想不到的异常,另外。这个异常并非常常出现。大部分情况下findViewById都会指向setContentView中的xml文件,在当中寻找对应id。仅仅有偶尔的情况下才会出现id指向其它界面的异常。


4.Demo下载:

http://download.csdn.net/detail/zhufuing/7430047

原文地址:https://www.cnblogs.com/lcchuguo/p/5141958.html