Java 为什么getApplicationContext在singleton getInstance中抛出nullPointerException?

Java 为什么getApplicationContext在singleton getInstance中抛出nullPointerException?,java,android,nullpointerexception,applicationcontext,Java,Android,Nullpointerexception,Applicationcontext,我创建了一个类GameHelper,它扩展了SQLiteOpenHelper。我希望它是一个单例,这样我就可以创建它,并让它在运行时存储数据库的内容,所有其他类都引用它 我遵循了建议,方法1 因此,当我需要引用数据库时,我不会创建GameHelper的新实例,而是调用getInstance。以下是相关代码: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstance

我创建了一个类GameHelper,它扩展了SQLiteOpenHelper。我希望它是一个单例,这样我就可以创建它,并让它在运行时存储数据库的内容,所有其他类都引用它

我遵循了建议,方法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 GameHelpercontext.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中设置android:name,但这里存在另一个问题。我在安卓工作室工作,当我尝试添加我的应用程序名时,名称变为红色。我想我可能做错了!清单中定义的我的软件包是com.example.android.whichgame,但应用程序本身及其所在的文件夹称为whichgame


所以我的问题是:当通过getInstance调用getApplicationContext时,我遗漏了什么导致getApplicationContext退出NPE?如果是因为我没有设置android:name,那么是什么导致Studio和编译器拒绝该名称?

您在初始化阶段过早地将GameInfo活动用作上下文。推迟需要有效上下文才能在活动生命周期中再次创建或稍后创建的初始化。

请发布整个堆栈跟踪。请在调用getInstance的地方发布完整的代码,而不仅仅是一行。这似乎已经修复了它,这很烦人,因为我绝对肯定我最初在那里使用过它,但它不起作用!