关于“getContext()。getString(resId);”的NullPointerException

时间:2015-12-23 10:10:43

标签: android android-studio nullpointerexception ocr crashlytics

我是一名学生正在开发Android OCR的学校项目。目前,我已成功完成Android Studio 1.5中的OCR功能。

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

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

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

enter image description here

以下是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.access$900(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.access$900(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)'是在空对象引用上。

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

非常感谢任何帮助/解决方案〜

3 个答案:

答案 0 :(得分:2)

问题出在这里。

return getContext().getString(resId);

您应该使用您的应用程序类instance

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

答案 1 :(得分:1)

看来你的问题就在这里:

public AndrOCRApp ()
{
    s_instance = this;
}

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

答案 2 :(得分:0)

试试这个

getResources().getString(resId);