2015-11-07 33 views
0

我創建了一個擴展SQLiteOpenHelper的類(GameHelper)。我希望它是一個單身人士,所以我可以創建它並讓它在運行時存儲數據庫的內容,所有其他類都引用它。爲什麼getApplicationContext在單例getInstance中拋出nullPointerException?

我按照建議here(方法1)。

因此,當我需要引用數據庫時,我不創建一個新的GameHelper實例,我調用getInstance。下面是相關的代碼:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_game_info); 
    populate(getIntent().getStringExtra("game"), getIntent().getStringExtra("game")); 
} 

public void populate(String gameToGo, String game) { 
    DataTable game = gameHelper.getgame(game, gameToGo); //GameInfo.java:12 
    TextView tv = (TextView) findViewById(R.id.tableId); 
    String text = game.TABLE_ID; 
    tv.setText(text); 
} 

它指的是以下的方法在GameHelper:

private static GameHelper sInstance; 

public static synchronized GameHelper getInstance(Context context) { 

// Use the application context, which will ensure that you 
// don't accidentally leak an Activity's context. 
// See this article for more information: http://bit.ly/6LRzfx 
    if (sInstance == null) { 
     sInstance = new GameHelper(context.getApplicationContext()); //GameHelper.java:60 
    } 

    return sInstance; 
} 

如圖這裏就行sInstance = new GameHelper(context.getApplicationContext());,這將引發一個NullPointerException出現該問題,:

11-08 10:14:54.974 16214-16214/com.example.android.whichgame E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.example.android.whichgame, PID: 16214 
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.android.whichgame/com.example.android.whichgame.GameInfo}: java.lang.NullPointerException 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2177) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2301) 
    at android.app.ActivityThread.access$800(ActivityThread.java:144) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1246) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5212) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
    at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:109) 
at com.example.android.whichgame.GameHelper.getInstance(GameHelper.java:60) 
    at com.example.android.whichgame.GameInfo.<init>(GameInfo.java:12) 
    at java.lang.Class.newInstanceImpl(Native Method) 
    at java.lang.Class.newInstance(Class.java:1208) 
    at android.app.Instrumentation.newActivity(Instrumentation.java:1062) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2155) 
                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2301) 
                at android.app.ActivityThread.access$800(ActivityThread.java:144) 
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1246) 
                at android.os.Handler.dispatchMessage(Handler.java:106) 
                at android.os.Looper.loop(Looper.java:136) 
                at android.app.ActivityThread.main(ActivityThread.java:5212) 
                at java.lang.reflect.Method.invokeNative(Native Method) 
                at java.lang.reflect.Method.invoke(Method.java:515) 
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602) 
                at dalvik.system.NativeStart.main(Native Method) 

我花了整整一天的時間在互聯網上尋找答案,雖然我發現了許多類似問題的答案,但我還沒有找到任何有幫助的東西。最好的和最受歡迎的答案似乎是我需要在AndroidManifest中爲<application>設置android:name,但這裏存在另一個問題。我在Android Studio中工作,當我嘗試添加我的應用程序名稱時,名稱變成紅色。我想這可能是我做錯了!我的包(在清單中定義)是「com.example.android.whichgame」,儘管應用程序本身(以及它所在的文件夾)被稱爲Wheregame。

所以我的問題是這樣的:我錯過了什麼導致getApplicationContext()通過getInstance調用時踢出NPE?如果這是因爲我沒有設置android:name,導致Studio和編譯器拒絕該名稱的原因是什麼?

+0

請發佈整個堆棧跟蹤。請發佈**完整的**代碼,你調用'getInstance()',而不只是一行。 – CommonsWare

回答

0

您在初始化階段過早使用GameInfo活動作爲Context。推遲在活動生命週期中需要有效ContextonCreate()或更高版本的初始化。

+0

這似乎已修復它,這是令人討厭的,因爲我絕對肯定我最初在那裏使用它,它不起作用! – CCalvert

相關問題