У меня есть фрагмент, где функция создает DatabaseHandler и вызывает функцию внутри объекта:Android getWritableDatabase бросает NullPointerException только иногда
final DatabaseHandler db = new DatabaseHandler(getActivity());
String teamName = db.getTeamName();
с DatabaseHandler конструктора существа:
Context context;
public DatabaseHandler(Context contextPassed) {
super(contextPassed, DATABASE_NAME, null, DATABASE_VERSION);
context = contextPassed;
}
Где-то внутри дб .getTeamName() (через другую функцию) У меня есть:
SQLiteDatabase db = this.getWritableDatabase();//exception here!
Это работает отлично в 99% случаев. Но если приложение некоторое время находилось в фоновом режиме, и я возобновляю его, я получаю исключение NullPointerException. Трудно реплицировать, потому что приложение должно быть в фоновом режиме на века, прежде чем это произойдет. Это заставляет меня думать о сборке мусора? Процесс начинается с намерения трансляции - не уверен, что это актуально. Я не могу отлаживать его, потому что я не могу его воспроизвести, но каждое утро, когда я просыпаюсь, я проверяю его, и он падает. Не очень хороший способ начать день, и это заставляет меня сходить с ума! LogCat:
threadid=1: thread exiting with uncaught exception (group=0x400259f8)
FATAL EXCEPTION: main
java.lang.RuntimeException: Error receiving broadcast Intent { act=updateSettingsTeamName } in [email protected]
at android.app.ActivityThread$PackageInfo$ReceiverDispatcher$Args.run(ActivityThread.java:938)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:144)
at android.app.ActivityThread.main(ActivityThread.java:4937)
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)
Caused by: java.lang.NullPointerException
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)
at com.gcm.goalpocket.DatabaseHandler.getUserID(DatabaseHandler.java:529)
at com.gcm.goalpocket.DatabaseHandler.getTeamName(DatabaseHandler.java:563)
at com.gcm.goalpocket.Settings.setTeamName(Settings.java:310)
at com.gcm.goalpocket.MainActivity$4.onReceive(MainActivity.java:257)
Если вам нужна база данных для чтения, используйте getReadableDatabse() только call getWritableDatabase(); когда вам нужно писать данные. –
Я попробую это сейчас - стыдно, что мне не нужно проверять до утра! – Cem