まず、この例外は定期的には発生しません。私には数回しか発生しませんでしたが、残念ながら、電話が接続されてデバッグされたときは発生しませんでした。私が入手したすべての情報は、ユーザーから送信された開発者コンソールのログとアプリのログからのものです。
まず、私が得たすべての情報は、DeveloperConsoleからのものでした。
Caused by: java.lang.NullPointerException
電話するとき:
//private SQLiteDatabase mDb; initialized earlier
ContentValues args = new ContentValues();
args.put(KEY_ENABLED, isEnabled);
return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0; //exception here
どういうわけかmDbがnullであることが原因である可能性があると推測して、正確に何が起こっているかを知るために、ここにロギングを追加しました
//DbAdapter
public boolean updateIsAlarmChecked(long rowId, boolean isEnabled) {
try {
ContentValues args = new ContentValues();
args.put(KEY_ENABLED, isEnabled);
return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;
} catch (Exception e) {
Utils.log("updateIsAlarmChecked exception: " + e.getMessage());
Utils.log("alarm enabled: " + isEnabled);
Utils.log("db is " + (mDb == null ? "null" : "not null"));
return false;
}
}
残念ながら、受信したログには次のものが含まれます。
updateIsAlarmChecked exception: null
alarm enabled: true
db is not null
つまり、SQLiteDatabase内にあるように見えますが、正確に何を見つけることができますか?または、Developer Consoleがそのクラス内からのトレースを表示しなかったため、そうではないでしょうか。
また、そのエラーの原因となるアクションについても説明します。おそらくそれが役立つでしょう。
- アプリケーションは正常に動作しています(私が知る限り)、アクティビティAは表示されています
- ユーザーがアラームを編集します-新しいアクティビティBが開かれ、新しく作成されて開かれたDbAdapter(NotePad Androidの例のクラスと同様のクラス。必要に応じてさらにコードを提供する場合があります)からアラームに関する情報が読み取られます。
- ユーザーが編集を終了し、正しく保存され、Bが意図的に結果を返し終えています。そのDbAdapterはonDestroyで閉じられています(onDestroyが常に呼び出されるとは限らないため、これが正しくないことに気づきました。それがエラーの原因である可能性がありますか?ただし、コメントアウトして閉じて実行しようとしましたが、エラーは発生しませんでした)
- onActivityResultはAで呼び出され、AのDbAdapterインスタンスのupdateIsAlarmCheckedを呼び出します(このインスタンスが「正しくない」場合がありますか?)
- 例外が発生してキャッチされ、更新が失敗します
何か案は?すべての助けは大いに感謝します
編集:最新のログの後の小さな更新。これで、コードは次のようになります。
ContentValues args = null;
try {
args = new ContentValues();
args.put(KEY_ENABLED, isEnabled);
return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0; //null exception here
} catch (Exception e) {
Utils.log("alarm enabled: " + isEnabled); //true
Utils.log("alarm id= " + rowId); //there is alarm with this rowId
Utils.log("db is " + (mDb == null ? "null" : "not null")); //not null
Utils.log("args is " + (args == null ? "null" : "not null")); //not null
Logger.logException(e);
return false;
}
最悪なのは、トレースポイントをreturnステートメントの行にのみスタックすることです。これにより、更新メソッドがさらに「進む」べきではないでしょうか。それで私にできることはありますか?それはたまにしか起こらないのはひどいことであり、私がユーザーに返信できるのは「もう一度やり直してみてください、たまにしか失敗しない」ということだけです...