今日のエラー

毎日遭遇する色々なエラーを書き留めています。ときどきエラーじゃない記事も有り。

Service の初期化ブロックで、インテントの初期化に失敗

Android のサービス中に初期化ブロックを置いて初期化しようとすると、 NullPointerException が発生する事態に遭遇。

コードは、以下のような単純なもの

Intent intent = new Intent("ACTION_HOGE", null, this, HogeService.class);

第三引数は、パッケージのコンテキストなので、this でなく getApplicationContext() に置き換えてみたけどダメ。

第二引数で Uri を null で指定するのがまずいのかと思い、以下のように2段階にしてみたけどこれもダメ。

Intent intent = new Intent("ACTION_HOGE");

intent.setClass(getApplicationContext(), HogeService.class);

この場合、最初の new Intent は実行され、次の setClass で失敗する。NullPointerException が発生することから、初期化ブロック内では値が確定していない「何か」を参照してしまっているということ?

んー、何か Java のお約束があるのか、もしくは単純なポカをやってるのか。

初期化ブロックでなく、コンストラクタもしくは onCreate() に記述したらどうなるか? 

週末にゆっくり考えてみよう。

 


あまり詳細に調べていないけど、どうも getApplicationContext() は問題ありそう。考えてみれば、初期化ブロック(やコンストラクタ)は、サービス開始(onCreate)前に動くコードなので、そこでコンテキスト(この場合の this や、getApplicationContext())を使用するのはまずいのではないかと思う。

結局、コンテキストを使用するコードをサービスに書く場合は、onCreate() 以降(に実行されるコード)に書く必要がある。ということかな。