java.lang.NullPointerException
at com.sni.Prayer.PrayerData.Update(PrayerData.java:148)
at com.sni.Prayer.WordActivity$6.onClick(WordActivity.java:173)
at android.view.View.performClick(View.java:2461)
at android.view.View$PerformClick.run(View.java:8888)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
at dalvik.system.NativeStart.main(Native Method)
而錯誤的程式是:
private static Cursor getWords(int prayerId) {
Cursor cursor=null;
try {
cursor = database.query(WORDS_TABLE, null, PRAYER_ID_IS+prayerId, null, null, null, null);
} catch(SQLException e) {
Log.e(TAG,e.getMessage());
}
return cursor;
}
Null Exception, 那當然就是database了,但是,為什麼如此? 執行到這一行,應該早就開啟了,為什麼沒有開啟呢? 當然,簡單加個 if(database==null) 的判斷是容易的,我的想法是,一定要找出原因,而且,不必執行的就不必執行,不要執行重覆的判斷。經過分析,發現:
自己很喜歡用static 變數,覺得
- 當作global來用
- 不必new就可以使用
- 只有一份記憶體,省空間
同時也想到,記憶體管理是以class, Activity為單位。因此,保留每一個類別的”完全”獨立,有助於記憶體管理。因此,將所有static改成private, 或是移到不是Activity的class中。
沒有留言:
張貼留言