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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章