0

再現できないランダムなNullPointerExceptionクラッシュレポートをGoogleから受け取っています。OrmLiteSqliteOpenHelperを拡張するクラスへの静的参照を使用しています。ヘルパーは、SherlockFragmentActivityを拡張するメインクラスで初期化されます。

if (DatabaseHelper.getInstance() == null) {
    DatabaseHelper.setInstance(this.getApplicationContext());
}

最初は、デバイスを回転させたり、バックグラウンドに送信したりすると発生する可能性があります。しかし、テストの量は問題を再現することができませんでした。

コードのどこにも静的mHelper変数がnullに設定されていません

public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
    …
    private static DatabaseHelper mHelper;
    …
    public static DatabaseHelper getInstance() {

        return DatabaseHelper.mHelper;
    }

    public static void setInstance(Context context) {

        DatabaseHelper.mHelper = new DatabaseHelper(context);
    }
    …
}

誰かがこれを引き起こしている可能性があるものについて何か考えを持っていますか?

フォローはレポートの1つです。

java.lang.RuntimeException: Unable to start activity ComponentInfo{au.com.dcbs.tradies/au.com.dcbs.tradies.presentation.document.DocumentActivity}: java.lang.NullPointerException
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2049)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2083)
at android.app.ActivityThread.access$600(ActivityThread.java:134)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1233)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4697)
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:787)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at bd.a(Document.java:654)
at au.com.dcbs.tradies.presentation.document.DocumentActivity$a.b(DocumentActivity.java:102)
at au.com.dcbs.tradies.presentation.document.DocumentActivity$a.onActivityCreated(DocumentActivity.java:78)
at e.a(FragmentManager.java:891)
at e.a(FragmentManager.java:1080)
at e.a(FragmentManager.java:1062)
at e.k(FragmentManager.java:1810)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:501)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1133)
at android.app.Activity.performStart(Activity.java:4549)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2022)
... 11 more

行654は、このメソッドの最初の行です。

public static Document get(long id, Context context) {

    DocumentEntity entity = DatabaseHelper.getInstance().getDocumentDao().queryForId((int)id);
    Document doc = new Document(entity, context);
    return doc;
}

getDocumentDaoはタイプのオブジェクトを返しますcom.j256.ormlite.dao.RuntimeExceptionDao

4

2 に答える 2

2

問題が発生した場所にコードを投稿すると役立ちます

at bd.a(Document.java:654)

ただし、問題を解決する可能性のある一般的な提案として、データベースヘルパーはapplicationアプリケーション全体で使用され、特定のアクティビティコンテキストに依存しないように見えるため、アクティビティではないクラスでデータベースヘルパーを初期化することを検討できます。

編集

どの関数がnullを返すかを判断するのは難しいため、654行目でコードを中断する必要があると思います。例えば

DatabaseHelper helper = DatabaseHelper.getInstance();
...
于 2013-02-05T04:02:43.430 に答える
2

Androidでは、静的フィールド変数が常に保持されるとは限りません。

public static DatabaseHelper getInstance(Context context) {
    if (mHelper == null) {
        mHelper = new DatabaseHelper(context);
    }
    return mHelper;
}
于 2013-02-05T04:10:35.933 に答える