我面临一个有点奇怪的问题。我正在尝试从资源中获取字符串,我有一个非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)
我尝试了其他一些方法,但似乎没有解决它。
如何修复此异常?
答案 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()
方法应该适合您。