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指向其他界面的異常。