即使对象不为null,也为空指针执行

时间:2016-07-10 02:18:16

标签: android nullpointerexception

我面临一个有点奇怪的问题。我正在尝试从资源中获取字符串,我有一个非activity class,我得到context,如下所示:

App app= App.getInstance();
if (app != null) {
    return app.getResources().getString(R.string.overview);
}

在调试控件时进入if语句,这意味着app不为空。

App类:

public class App extends Application {

    private static App app = new App ();

    private App () {

    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    public static App getInstance() {
        if (app == null) {
            app = new App ();
        }
        return app;
    }
}

一切似乎都很好,但是当我运行它时,我得到空指针异常:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
        at android.content.ContextWrapper.getResources(ContextWrapper.java:87)
        at com.emanager.ui.adapters.HomePagerAdapter.getPageTitle(HomePagerAdapter.java:45)
        at android.support.design.widget.TabLayout.populateFromPagerAdapter(TabLayout.java:773)
        at android.support.design.widget.TabLayout.setPagerAdapter(TabLayout.java:764)
        at android.support.design.widget.TabLayout.setupWithViewPager(TabLayout.java:716)
        at com.emanager.ui.activities.HomeActivity.onCreate(HomeActivity.java:65)
        at android.app.Activity.performCreate(Activity.java:6237)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
        at android.app.ActivityThread.-wrap11(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:148) 
        at android.app.ActivityThread.main(ActivityThread.java:5417) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

我尝试了其他一些方法,但似乎没有解决它。

如何修复此异常?

3 个答案:

答案 0 :(得分:4)

您不应该自己创建应用程序,它将在您的应用程序在活动开始之前运行时创建。

试试这个:

System.exit(0)

答案 1 :(得分:2)

你的代码问题是你将Application类的默认构造函数声明为私有构造函数。虽然没有必要声明构造函数但是如果你声明它,那么你必须将它公开@MikeM.建议这个在这里回答这个问题的另一个答案

就这样做

public class App extends Application {

    private static App app;
   public App()
      {
        //got a public constructor
      }
   @Override
   public void onCreate() {
       super.onCreate();
       app = this;
   }

   public static App getInstance() {
       return app;
   }
}

并在您的AndroidMenifest.xml中

<application
        android:name=".App"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

答案 2 :(得分:0)

Singleton模式是一个很好的模式,虽然我不明白为什么你需要所有这些。您能解释一下为什么您需要通过整个应用程序提供您的应用实例吗?

关于您的问题,getApplicationContext()方法应该适合您。