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)
パッと見 エラー箇所分からなかったけど、よくよく見ると Sudoku.java:51 があったので確認
startActivity(i);

ああ、そっか。

原因

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() があるので「初期化されない可能性があります」と怒られるため