【问题标题】:getExternalFilesDir(null) throws NullPointerExceptiongetExternalFilesDir(null) 抛出 NullPointerException
【发布时间】:2012-10-11 01:17:48
【问题描述】:

我正在构建一个 Android 应用程序,并且我选择在外部存储中使用扁平苍蝇作为我的持久性方法。我有一个使用一些静态实例方法扩展 Application 的类。经过几次调试,我注意到实例变量都不是null,而NullPointerException 来自Context.getExternalFilesDir(null)

我想以它不返回空值作为任何答案的开头。此外,我的清单中有正确的权限,并且可以检查 SD 卡是否已安装到设备上。

这是持有对getExternalFilesDir(null) 的调用并引发错误的类。

public class WhileImOut extends Application {

    public static TaskManager taskManager;
    private static Context appContext;

    public WhileImOut() {
        super();
        appContext = this;
        initialize();
    }

    public static void initialize() {
        if (taskManager == null && Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            try{
            File f = appContext.getExternalFilesDir(null); // Exception being thrown here
            taskManager = new TaskManager(f.getAbsolutePath());
            }catch(NullPointerException e){
                Log.d("Bad","NPE");
            }catch(Exception e){

            }
        }
    }
}

这是在我的 AndroidManifest.xml 中:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

任何帮助将不胜感激。我已经为此苦苦挣扎了几个小时,我会接受给出的任何建议。谢谢

编辑:LogCat 信息

10-10 18:55:56.424: E/AndroidRuntime(964): FATAL EXCEPTION: main
10-10 18:55:56.424: E/AndroidRuntime(964): java.lang.RuntimeException: Unable to resume activity {zsmith.capstone.whileimout/zsmith.capstone.whileimout.TaskListActivity}: java.lang.NullPointerException
10-10 18:55:56.424: E/AndroidRuntime(964):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2575)
10-10 18:55:56.424: E/AndroidRuntime(964):  at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2603)
10-10 18:55:56.424: E/AndroidRuntime(964):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2089)
10-10 18:55:56.424: E/AndroidRuntime(964):  at android.app.ActivityThread.access$600(ActivityThread.java:130)
10-10 18:55:56.424: E/AndroidRuntime(964):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
10-10 18:55:56.424: E/AndroidRuntime(964):  at android.os.Handler.dispatchMessage(Handler.java:99)
10-10 18:55:56.424: E/AndroidRuntime(964):  at android.os.Looper.loop(Looper.java:137)
10-10 18:55:56.424: E/AndroidRuntime(964):  at android.app.ActivityThread.main(ActivityThread.java:4745)
10-10 18:55:56.424: E/AndroidRuntime(964):  at java.lang.reflect.Method.invokeNative(Native Method)
10-10 18:55:56.424: E/AndroidRuntime(964):  at java.lang.reflect.Method.invoke(Method.java:511)
10-10 18:55:56.424: E/AndroidRuntime(964):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
10-10 18:55:56.424: E/AndroidRuntime(964):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-10 18:55:56.424: E/AndroidRuntime(964):  at dalvik.system.NativeStart.main(Native Method)
10-10 18:55:56.424: E/AndroidRuntime(964): Caused by: java.lang.NullPointerException
10-10 18:55:56.424: E/AndroidRuntime(964):  at zsmith.capstone.whileimout.TaskListActivity.onResume(TaskListActivity.java:58)
10-10 18:55:56.424: E/AndroidRuntime(964):  at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1184)
10-10 18:55:56.424: E/AndroidRuntime(964):  at android.app.Activity.performResume(Activity.java:5082)
10-10 18:55:56.424: E/AndroidRuntime(964):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2565)

【问题讨论】:

  • 您可以发布 LogCat 输出吗? (不要只是吞下事件,获取堆栈跟踪。)
  • 另外,您可能希望将READ_EXTERNAL_STORAGE 权限添加到您的清单中。

标签: java android nullpointerexception


【解决方案1】:

您正在构造函数中进行初始化;这行不通。您应该在onCreate() 中进行初始化。调用构造函数时,上下文尚未正确初始化。

public class WhileImOut extends Application {

    public static TaskManager taskManager;
    private static Context appContext;

    public void onCreate() {
        super();
        appContext = this;
        initialize();
    }

    public static void initialize() {
        if (taskManager == null && Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            try{
            File f = appContext.getExternalFilesDir(null); // Exception being thrown here
            taskManager = new TaskManager(f.getAbsolutePath());
            }catch(NullPointerException e){
                Log.d("Bad","NPE");
            }catch(Exception e){

            }
        }
    }
}

(顺便问一下,有什么理由有一个单独的initialize() 方法吗?如果有,有什么理由让它成为public?)

【讨论】:

  • 啊...我的朋友告诉我如何做到这一点,他说 onCreate 在这种情况下不是一个有效的方法,所以我没有真正检查它。太感谢了。它奏效了,现在我可以继续前进了。
  • 到目前为止,没有任何理由,但我计划在解决主要问题后解决问题
  • 服务也是如此。在构造函数中 getExternalFilesDir(null) 抛出 NPE。回调 onHandleIntent 对 getExternalFilesDir(null) 来说很好。
猜你喜欢
  • 2012-06-05
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-15
  • 2018-11-15
  • 2017-08-11
相关资源
最近更新 更多