初學者。今天寫一個活動之間跳轉的程式碼,用到了顯式的intent,但是我在類別中定義了一個intent的成員變量,在方法中使用時候,程式卻崩潰了,這是為什麼呢?
public class MusicPlay extends Activity{
//下面这一句初始化出了错误
public Intent intent=intent=new Intent(this,MusicServer.class);
....
如上程式碼,但是錯誤訊息提示是:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
據說是在「空物件參考」上呼叫getPackageName()虛方法出現了錯誤。
起初,我以為是this是空從而導致問題,修改了程式碼:
public class MusicPlay extends Activity{
Intent intent;
public MusicPlay(){
super();
if(this!=null){
intent=new Intent(this,MusicServer.class);
}
}
....
但是仍然出現了錯誤,錯誤訊息還是一樣的。透過條件判斷我知道this不為空,那為什麼還說是空引用呢?
Activity
是ContextWrapper
的子类, 所以我们先找到并打开ContextWrapper.java
源碼, 關鍵代碼如下:ContextWrapper
里基于Context
的调用都是直接使用mBase
来间接实现调用的. 那么这个mBase
是什么时候被赋值的呢? 找到并打开ActivityThread.java
, 就能找到它被賦值的程式碼部分, 關鍵程式碼如下:以上, 可知: 實例化
Activity
时,ContextWrapper#getBaseContext()
返回的是null, 因此, 不能在构造函数或者构造成员变量时直接调用与Context
相關的任何函數和類別的實例化. 如果需要, 則在其生命週期函數中去調用.你的類別繼承了Activity類別,那麼它就有生命週期,所有邏輯都在這幾個生命週期裡面進行,換而言之,你的邏輯代碼都要寫在那幾個生命週期的方法裡面.一般來說,都是重寫onCreate的方法,在那裡面寫頁面跳轉.你的方法的標識符命名也不規範
要重寫onCreate()方法啊