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_r1および4.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)を行ったか、インスタンス化するレイアウトまたはビューに何か悪いことをしました。まず、これが発生したときに何が起動されているかを確認します。

この種の例外をトリガーするもう1つの簡単な方法は、マニフェストでそのように宣言せずに、呼び出しとアクティビティ(またはサービスなど)を行うことです。または、許可が必要なことを実行して、それを宣言するのを忘れてください(ただし、この場合はそのエラーのようには見えません)。

于 2013-03-10T20:02:55.147 に答える