"getContext().getString(resId);" 上的 NullPointerException

NullPointerException on "getContext().getString(resId);"

我是一名学生,正在从事 Android OCR 学校项目。目前,我已经在AndroidStudio 1.5.

中成功完成了OCR功能

但是,我想在 Android Studio 中将此应用程序(非 Material 主题)编译成另一个应用程序(具有 Material 主题设计)。

我已经适当地复制和完善了大部分代码。然而,当我 运行 我设备上的应用程序时,它在某个时刻崩溃了。

我在我的应用程序中实施了 Crashlytics,它显示以下错误:

以下为logcat信息:

    Fatal Exception: java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.l33902.contactmanagment1512/com.example.l33902.contactmanagment1512.ShowImage}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getString(int)' on a null object reference
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2546)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2754)
       at android.app.ActivityThread.access0(ActivityThread.java:177)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:145)
       at android.app.ActivityThread.main(ActivityThread.java:5938)
       at java.lang.reflect.Method.invoke(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:372)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1389)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1184)
Caused by java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getString(int)' on a null object reference
       at com.example.l33902.contactmanagment1512.AndrOCRApp.myGetString(AndrOCRApp.java:22)
       at com.example.l33902.contactmanagment1512.ShowImage.<init>(ShowImage.java:40)
       at java.lang.reflect.Constructor.newInstance(Constructor.java)
       at java.lang.Class.newInstance(Class.java:1650)
       at android.app.Instrumentation.newActivity(Instrumentation.java:1079)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2536)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2754)
       at android.app.ActivityThread.access0(ActivityThread.java:177)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:145)
       at android.app.ActivityThread.main(ActivityThread.java:5938)
       at java.lang.reflect.Method.invoke(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:372)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1389)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1184)

根据 Crashlytics 和 Logcat,我可以看出该错误是由 NullPointerException 引起的。但是,当我深入到导致错误的 logcat 所述的代码时,我无法弄清楚如何解决它。

正如 Crashlytics 和 Logcat 所述,问题的根源在于这两个文件(AndrOCRApp.java 和 ShowImage.java)(以下是代码):

- AndrOCRApp.java

public class AndrOCRApp extends Application {

    private static AndrOCRApp s_instance;

    public AndrOCRApp ()
    {
        s_instance = this;
    }

    public static Context getContext()
    {
        return s_instance;
    }

    public static String myGetString(int resId)
    {
        **return getContext().getString(resId);**       
    }

}

- ShowImage.java

private final String[] mSegModeArray = { AndrOCRApp.myGetString(R.string.PSM_AUTO), AndrOCRApp.myGetString(R.string.PSM_SINGLE_BLOCK), AndrOCRApp.myGetString(R.string.PSM_SINGLE_LINE), AndrOCRApp.myGetString(R.string.PSM_SINGLE_WORD), AndrOCRApp.myGetString(R.string.PSM_SINGLE_CHAR), AndrOCRApp.myGetString(R.string.PSM_SINGLE_BLOCK_VERT_TEXT) };

粗体 行是导致错误的代码。

错误指出尝试调用虚拟方法 'java.lang.String android.content.Context.getString(int)' 是在空对象引用上。

但是我无法解决这个错误,因为之前的原始项目(编译前)没有显示这样的错误。

如有help/solutions不胜感激~

试试这个

getResources().getString(resId);

看来你的问题出在这里:

public AndrOCRApp ()
{
    s_instance = this;
}

您不应该为 ApplicationActivityFragment 或任何其他生命周期由系统控制的 Android 框架对象使用自定义构造函数.相反,覆盖您需要的生命周期方法。在这种情况下,您应该在应用程序 class 的 onCreate 生命周期方法中分配 s_instance

问题就在这里

return getContext().getString(resId);

您应该在您的应用程序中使用 class instance

return s_instance.getContext().getString(resId);