質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

1188閲覧

RoomDatabaseインスタンスを作成しようとすると、java.lang.Package.getName()がNullPointerExceptionになる

gitboku

総合スコア32

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

1クリップ

投稿2018/03/19 14:07

##質問内容
1:RoomDatabaseのインスタンスを生成しようとしたらCaused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Package.getName()' on a null object referenceというエラーが出てきたのですが、Roomを扱うには何のパッケージが必要なのでしょうか?
2:自分はRoomDatabaseがSQLiteを含めたパッケージだと認識していたのですが、もしかしてRoomDatabaseとはDB Helperのようなもので、SQLite自体は別に用意しなければならないのでしょうか?

##疑問に至るまでの経緯
現在作成中のアプリ内でRoomDatabaseを使おうとしています。
使用言語はKotlinで、このQiitaの記事を参考にRoomを導入しました。
EntityとDAOとAppDatabaseクラスを作成し、その状態で動くことは確認しました。
次に、RoomDatabaseのインスタンスを作成するため以下のコードをプロジェクト内に追記しました。

// Kotlin val db = Room.databaseBuilder(applicationContext, AppDatabase::class.java, "applyDatabase").build()

しかし、上記のコードを追記したActivityに移動した瞬間、以下のエラーポップアップが出てきてアプリが異常終了してしまいます("To Did List"はアプリの名前です)。

イメージ説明

AndroidStudioのLogcatを見てみると、以下のようなエラーが出ていることが確認できました(見やすいようにCaused by: java.lang.NullPointerException:の後ろで改行しています)。

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Package.getName()' on a null object reference at android.arch.persistence.room.Room.getGeneratedImplementation(Room.java:77) at android.arch.persistence.room.RoomDatabase$Builder.build(RoomDatabase.java:454) at com.example.user.todidlist.EditDiaryActivity.onCreate(EditDiaryActivity.kt:16)

Room.javaの77行目でNullPointerExceptionが出ているとのことですが、該当コードは以下のようになっていました。

java

1// Room.java 2static <T, C> T getGeneratedImplementation(Class<C> klass, String suffix) { // 76行目 3 final String fullPackage = klass.getPackage().getName(); // 77行目

77行目にブレークポイントを挟んでみると、76行目の横にklass: "class AppDatabase" suffix: "_Impl"というのが見えたので、klassではなくklass.getPackage()がNullであることがわかりました。

以上が今回の疑問に至った経緯です。
冒頭にも書きましたが、現在の疑問は以下の二つです。
0. klass.getPackage()で求められているパッケージとは何でしょうか?
必要なライブラリなどはapp/build.gradleにすべて書いたつもりなのですが、何か欠けているのでしょうか?
0. 今回のエラーとは関係あるかわかりませんが、SQLiteはRoomとは別に用意しなければならないのでしょうか?
自分はRoomDatabaseがSQLiteを含めてたパッケージだという認識なのですが、RoomDatabaseはあくまでDB Helperの代わりでありSQLite自体を含んでいるわけではないのでしょうか?

##RoomDatabaseを使うために追記したコード

// app/build.gradle apply plugin: 'kotlin-kapt' // 略 dependencies { //略 implementation "android.arch.persistence.room:runtime:1.0.0" kapt "android.arch.persistence.room:compiler:1.0.0" }
// Daily.kt @Entity class Diary { /** * PrimaryKey is Non-null */ @PrimaryKey var did: Int = 0 // 略 }
// DiaryDao.kt @Dao interface DiaryDao{ @Query("SELECT * FROM diary") fun getAll(): List<Diary> @Insert fun insert(diary: Diary) @Delete fun delete(diary: Diary) }
// AppDatabase.kt @Database(entities = [Diary::class], version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun diaryDao(): DiaryDao }
// EditDiaryActivity.kt RoomDatabaseのインスタンスを生成しようとしたActivity import android.os.Bundle import kotlinx.android.synthetic.main.activity_edit_diary.* import AppDatabase import android.arch.persistence.room.Room class EditDiaryActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_edit_diary) val db = Room.databaseBuilder(applicationContext, AppDatabase::class.java, "applyDatabase").build() }

##環境情報
Kotlin version 1.2.30 (JRE 1.8.0_152-release-915-b01)
Android Studio 3.0.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

keicha_hrs

2018/03/20 05:47

ご提示いただいたコードを「ほぼ」そのまま記述して実行してみましたが、正常に動作しており、再現できません。問題とされているRoom.javaの77行目もnullが返ることはなく、変数fullPackageに正しく値が入っています。ただ、一つ気になるのは、Activityのコードで「import AppDatabase」と記述されている部分、これは何ですか?このような記述をするとエラーになるのではないかと思うのですが。
gitboku

2018/03/20 16:05

databaseBuilder()の第2引数「AppDatabase::class.java」の「AppDatabase」の部分が赤字になり、カーソルを合わせると「Unresolved reference」と表示されます。なので書き足したコードです。keicha_hrs様のご指摘を見てふと思いついたことを試したらエラーがなくなり動くようになりました。詳しくは自己解決法の部分に記述させていただきますが、助言をしていただき厚く御礼申し上げます。
guest

回答1

0

自己解決

「"import AppDatabase"のような記述をするとエラーになるのでは?」というご指摘をkeicha_hrs様から頂いたときに思い付いた解決法を記載します。

端的に言うと、クラスファイルのディレクトリ構成がまずかったようです。
この質問をしたときの自分のプロジェクトツールウィンドウの略図(Androidビュー)を以下に示します。

app |-manifests |-java |-com.example.user.applyName |-MainActivity |-SubActivity // インスタンスを生成するActivity |-AppDatabase |-Dairy |-DairyDao |-res

新しいクラスファイルを作成するとき、場所については特に考えずに作っていたためこのような配置になっていました。
'AppDatabase''Dairy''DairyDao'の3つをSubActivityと同じ場所に移したらうまく動くようになりました。

自分の初歩的なミスが原因だったようです。
keicha_hrs様には改めてお礼を申し上げます。

投稿2018/03/20 16:25

編集2018/03/21 07:06
gitboku

総合スコア32

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

keicha_hrs

2018/03/21 05:42 編集

これでは確かに動きませんね。ここまでは考えが至りませんでした。余談ですが、 > この記入欄はスペースを空けることができないようなので 質問記入時にソースコードを記述したときと同じく、```の行で上下を囲めばスペースを空けることができます。 また、解決したならばこの自分の回答をベストアンサーにして、質問をクローズしてください。
gitboku

2018/03/21 07:08 編集

自身の質問を解決済みにしました。 的確なご指摘をいただいたこと、重ねてお礼申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問