Android

[Android]Attempt to invoke virtual method ‘io.realm.RealmQuery io.realm.Realm.where(java.lang.Class)’ on a null object reference

Android Studio + Realm使用時のトラブルシューティングメモ。

発生した事象

Realmでデータベース処理を実行したときに
「java.lang.NullPointerException: Attempt to invoke virtual method ‘io.realm.RealmQuery io.realm.Realm.where(java.lang.Class)’ on a null object reference」

 

なるエラーがでました。ちゃんとデータはあるはずなのに、「~null object reference」(訳すと「nullを参照してますよ」)なんてメッセージが出ます。

原因

原因は簡単。データベース処理の直前に「Realm.getDefaultInstance();」を宣言していないためです。

mRealm = Realm.getDefaultInstance();←これがないと今回のエラーが発生する。

//Realmのデータベース処理
final Template template_del
 = mRealm.where(Template.class)
      .equalTo("id",template.getId())
      .findFirst();

mRealm.executeTransaction(new Realm.Transaction() {
 @Override
 public void execute(Realm realm) {
  template_del.deleteFromRealm();
 }
});

そりゃあ、Realmのインスタンス生成してなければ、ダメですよね・・・。開発、慌て過ぎ。

そもそも、コピペで開発しているからこんなことになるんですよね。。

恒久対策 未定・・・大いに反省

今回の失敗は、意味を理解して上から順にコード書けばこんなことににはならない。根本的なものの考え方を変える必要があると感じました。しかも、これ見つけるのに30分くらいかかったし、ダメすぎるだろう。。。

並のプログラマーは、まずこの間違いをしない上に、万が一間違っても、数秒で気づく。
こういうことを気付けるようになるような訓練をしてたい。何か思いついたら記事にします。

個人開発
ヨーセツ
プログラミング関係の会社に入社してから10年くらいはマイナーな言語の開発者でしたが、2016年からスキルチェンジし、JavaやOracleなどに携われるように。今まで使っていなかったIT基礎知識も再勉強中。 Androidアプリも作りながら個人開発者の道を目指しています。 最近、作ったワーキングメモリーを鍛えるアプリです。