Android 空指针执行选项,即使对象不为空
我面临着一个有点奇怪的问题。我试图从参考资料中获取字符串,我有一个非Android 空指针执行选项,即使对象不为空,android,nullpointerexception,Android,Nullpointerexception,我面临着一个有点奇怪的问题。我试图从参考资料中获取字符串,我有一个非活动类,在这里我获取上下文,如下所示: App app= App.getInstance(); if (app != null) { return app.getResources().getString(R.string.overview); } 调试时,控件进入if语句中,这意味着app不为空 应用程序类: public class App extends Application { private st
活动类
,在这里我获取上下文
,如下所示:
App app= App.getInstance();
if (app != null) {
return app.getResources().getString(R.string.overview);
}
调试时,控件进入if语句中,这意味着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)
我尝试过其他一些方法,但似乎没有解决它
如何修复此异常?您不应自行创建应用程序,它将在活动开始前应用程序运行后创建 试试这个:
public class App extends Application {
private static App app;
@Override
public void onCreate() {
super.onCreate();
app = this;
}
public static App getInstance() {
return app;
}
}
您不应自行创建应用程序,它将在活动开始前应用程序运行后创建 试试这个:
public class App extends Application {
private static App app;
@Override
public void onCreate() {
super.onCreate();
app = this;
}
public static App getInstance() {
return app;
}
}
单例模式是一个很好的模式,尽管我不明白为什么您需要所有这些。你能解释一下为什么你需要让你的应用程序实例在整个应用程序中都可用吗
关于你的问题,
getApplicationContext()
方法应该是一种适合你的方法。单例模式是一种很好的模式,尽管我不明白你为什么需要所有这些。你能解释一下为什么你需要让你的应用程序实例在整个应用程序中都可用吗
关于您的问题,
getApplicationContext()
方法应该是一种适合您的方法。您的代码的问题是您将应用程序类的默认构造函数声明为私有构造函数。虽然根本不需要声明构造函数,但如果您声明了,那么您必须将其公开。在这里的另一个问题答案的注释中建议了这一点
就这么做吧
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">
您的代码的问题是您将应用程序类的默认构造函数声明为私有构造函数。虽然根本不需要声明构造函数,但如果您声明了构造函数,那么您必须将其公开,这是在此处对该问题的另一个答案的注释中建议的 就这么做吧
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">
@nongthonbamthonthoi还确保您已将应用程序
类指定为清单中
的名称。@MikeM。你的评论修正了它,没想到它会成为原因。感谢您在menifest文件中尝试命名应用程序类时给出的答案。它显示了一个错误,即应用程序类没有默认构造函数,因此您必须在应用程序类中创建一个公共构造函数才能使其工作@Harlonpublic constructor在扩展应用程序时不是必需的,我以前在我的项目中使用过它。@Tapanparmar您根本不需要显式地实现构造函数,但是如果您这样做,并且将其设置为私有的,则会失败。解决方案是删除构造函数,在清单中指定正确的名称
,然后实现这个答案。我想指出,这个答案没有私有
构造函数。@nongthonbamthonthoi还确保您已将应用程序
类指定为清单中
的名称。@MikeM。你的评论修正了它,没想到它会成为原因。感谢您在menifest文件中尝试命名应用程序类时给出的答案。它显示了一个错误,即应用程序类没有默认构造函数,因此您必须在应用程序类中创建一个公共构造函数才能使其工作@Harlonpublic constructor在扩展应用程序时不是必需的,我以前在我的项目中使用过它。@Tapanparmar您根本不需要显式地实现构造函数,但是如果您这样做,并且将其设置为私有的,则会失败。解决方案是删除构造函数,在清单中指定正确的名称
,然后实现这个答案。我要指出的是,这个答案没有private
构造函数。我需要有singleton,这样我就可以在不扩展活动的类中访问上下文。我需要有singleton,这样我就可以在不扩展活动的类中访问上下文。OK,确保你在AndroidMenifest.xml@nongthonbamthonthoimike M的注释中找到它修正了我的问题,但你回答了我是的,现在看到了!!Chill@nongthonbamthoiok确保你在AndroidMenifest.xml@nongthonbamthoimike M的评论修复了我的问题,但你回答了我,是的,现在看到了!!冷却@nongthonbamthonthoigo有解决方案吗?当你得到“请@nongthonbamthonthoigo”一个解决方案时发布它?当你得到请发到@nongthonbamthontoi