3

我收到了这个堆栈跟踪报告,其中根本没有提到我的应用程序:

java.lang.NullPointerException
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3979)
at android.app.ActivityThread.access$1300(ActivityThread.java:130)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1255)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)

有谁知道如何防止这种异常?

4

2 回答 2

6

与往常一样,当发生这种情况时,我必须深入研究 Android 源来评估问题,我想我会在这里发布我的发现,这样可以节省其他人的时间。

此错误对应于4.1.1_r14.1.2_r1中的此代码:

    final ContextImpl appContext = new ContextImpl();
    appContext.init(data.info, null, this);
    final File cacheDir = appContext.getCacheDir();

    // Provide a usable directory for temporary files
    System.setProperty("java.io.tmpdir", cacheDir.getAbsolutePath()); // line 3979

    setupGraphicsSupport(data.info, cacheDir);

发生这种情况是因为appContext.getCacheDir()在某些情况下返回 null:

@Override
public File getCacheDir() {
    synchronized (mSync) {
        if (mCacheDir == null) {
            mCacheDir = new File(getDataDirFile(), "cache");
        }
        if (!mCacheDir.exists()) {
            if(!mCacheDir.mkdirs()) {
                Log.w(TAG, "Unable to create cache directory");
                return null;
            }
            FileUtils.setPermissions(
                    mCacheDir.getPath(),
                    FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
                    -1, -1);
        }
    }
    return mCacheDir;
}

相关: https ://groups.google.com/forum/?fromgroups=#!topic/android-developers/-694j87eXVU


但是,这似乎在4.2.1版本中得到了正确处理:

    final ContextImpl appContext = new ContextImpl();
    appContext.init(data.info, null, this);
    if (!Process.isIsolated()) {
        final File cacheDir = appContext.getCacheDir();

        if (cacheDir != null) {
            // Provide a usable directory for temporary files
            System.setProperty("java.io.tmpdir", cacheDir.getAbsolutePath());

            setupGraphicsSupport(data.info, cacheDir);
        } else {
            Log.e(TAG, "Unable to setupGraphicsSupport due to missing cache directory");
        }
    }
于 2013-03-10T19:58:21.693 回答
1

我通常会发现当服务、活动或其他任何东西在启动时遇到问题时,我会遇到这类异常。通常,我在课堂上的变量初始化中做了一些坏事 (TM),或者我对我正在实例化的布局或视图做了其他坏事。我将首先查看发生这种情况时正在启动的内容。

触发这种异常的另一种简单方法是调用和活动(或服务等),而无需在清单中声明它。或者尝试做一些需要许可的事情并忘记声明(尽管在这种情况下它看起来不像那个错误)。

于 2013-03-10T20:02:55.147 回答