java.lang.NullPointerException(初めてのAndroid P.52)
毛利です。
より、ちょっとつまづいたのでエントリー。
LogCat が見辛くてエラーをよく読まなかっただけ なんだけども。
※後述しますが、本エラーが発生するか否かは onClick メソッドの書き方次第です
事象
P.52 / リスト 3-29
case R.id.exit_button: finish(); break;
↑を追加したところ
ERROR/AndroidRuntime(490): FATAL EXCEPTION: main ERROR/AndroidRuntime(490): java.lang.NullPointerException ERROR/AndroidRuntime(490): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1373) ERROR/AndroidRuntime(490): at android.app.Activity.startActivityForResult(Activity.java:2827) ERROR/AndroidRuntime(490): at android.app.Activity.startActivity(Activity.java:2933) ERROR/AndroidRuntime(490): at org.example.sudoku.Sudoku.onClick(Sudoku.java:51) ERROR/AndroidRuntime(490): at android.view.View.performClick(View.java:2485) ERROR/AndroidRuntime(490): at android.view.View$PerformClick.run(View.java:9080) ERROR/AndroidRuntime(490): at android.os.Handler.handleCallback(Handler.java:587) ERROR/AndroidRuntime(490): at android.os.Handler.dispatchMessage(Handler.java:92) ERROR/AndroidRuntime(490): at android.os.Looper.loop(Looper.java:123) ERROR/AndroidRuntime(490): at android.app.ActivityThread.main(ActivityThread.java:3647) ERROR/AndroidRuntime(490): at java.lang.reflect.Method.invokeNative(Native Method) ERROR/AndroidRuntime(490): at java.lang.reflect.Method.invoke(Method.java:507) ERROR/AndroidRuntime(490): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) ERROR/AndroidRuntime(490): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) ERROR/AndroidRuntime(490): at dalvik.system.NativeStart.main(Native Method)
原因
break; じゃダメだった。
public void onClick(View v){ Intent i = null; switch(v.getId()){ case R.id.continue_button: i = new Intent(this, Continue.class); break; case R.id.new_button: openNewGameDialog(); i = new Intent(this, New.class); break; case R.id.about_button: i = new Intent(this, About.class); break; case R.id.exit_button: finish(); return; // ここは break; じゃダメ default: return; } startActivity(i); // finish() した後、ここに到達してしまうので }
終わらせたのに始めさすんじゃねーよ!ってことらしい。
ちなみに、↓のように書いてるなら break; でも問題ないはず。(動作確認してません)
- P.41 リスト3-13 を踏襲するとこうなる
public void onClick(View v){ switch(v.getId()){ case R.id.continue_button: Intent i = new Intent(this, Continue.class); startActivity(i); break; case R.id.new_button: openNewGameDialog(); Intent i = new Intent(this, New.class); startActivity(i); break; case R.id.about_button: Intent i = new Intent(this, About.class); startActivity(i); break; case R.id.exit_button: finish(); break; default: break; } }
- Intent 宣言*1
- startActivity
を何度も書きたくなかったので前者のような書き方してました。
ではではー。
*1:null を代入しているのは、switch 文に return() があるので「初期化されない可能性があります」と怒られるため