10-04 17:43:05.400: E/AndroidRuntime(7135): Caused by: java.lang.NullPointerException
10-04 17:43:05.400: E/AndroidRuntime(7135): at com.solar.LoginActivity.initView(LoginActivity.java:35)
10-04 17:43:05.400: E/AndroidRuntime(7135): at com.solar.LoginActivity.onCreate(LoginActivity.java:17)
10-04 17:43:05.400: E/AndroidRuntime(7135): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
10-04 17:43:05.400: E/AndroidRuntime(7135): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
10-04 17:43:05.400: E/AndroidRuntime(7135): ... 11 more
如下所示,是提示錯誤的OnCreate函數。
1 protected void onCreate(Bundle savedInstanceState) { 2 super.onCreate(savedInstanceState); 3 Button btnLogin = (Button) findViewById(R.id.login_btn_login); //這里出錯 4 this.setContentView(R.layout.login_page); 5 }
NullPointerException?找了好久,搞不清楚為什么出現這個錯誤。因為這句話怎么也看不出錯誤。布局文件里面也確實有login_btn_login這個按鈕。
Button btnLogin = (Button) findViewById(R.id.login_btn_login);
后面終於想到:整個Activity都還沒有渲染R.layout.login_page這個布局文件呢。怎么能要求他在R.layout.login_page這個布局文件里面找到按鈕呢。所以返回的是null。
終於找到一段更好的解釋:
當activity 調用 setContentView() 時,android 才會去繪制 layout 上的各個元素,並為其分配內存。只有 分配了內存以后,才能繼續執行 ,findViewById(); 才能得到引用,不然得到空引用。
空引用意味着,后面使用相應變量時就會發生訪問的對象不存在的問題。
而且當Activity重新setContentView()以后,那些之前繪制的控件,內存都被滅掉了。
所以,若是通過setContentView 來達到畫面切換目的的,要注意重新繪制以后重新取得引用。