2013-02-05 80 views
0

我收到來自Google的隨機NullPointerException崩潰報告,無法複製。我正在使用擴展OrmLiteSqliteOpenHelper的類的靜態引用。輔助器在擴展SherlockFragmentActivity的主類中初始化。NullPointerException崩潰報告使用靜態DatabaseHelper

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); 
    } 
    … 
} 

有誰有什麼可能會導致此任何想法?

如下的報告之一:

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

回答

2

這將有助於如果您發佈問題發生的代碼

at bd.a(Document.java:654) 

但是,這可能會解決你的問題,因爲一般的建議,您可以考慮初始化數據庫助手在application類沒有任何活動,因爲它似乎是用於整個應用程序的東西,不依賴於具體的活動情境。

編輯

我認爲你需要在第654打破代碼,因爲它是很難分辨哪個函數返回null。例如

DatabaseHelper helper = DatabaseHelper.getInstance(); 
... 
+1

我已經添加的代碼段654不知道如何擴展應用一流的,但感激你指出了。絕對是一個更好的面向對象方法,謝謝。 – RobCroll

2

在Android中,它並不能保證靜態字段變量並不總是不停,你應該......

public static DatabaseHelper getInstance(Context context) { 
    if (mHelper == null) { 
     mHelper = new DatabaseHelper(context); 
    } 
    return mHelper; 
}