人工知能学期プロジェクト用のAndroidゲームアプリを作成しています。メインクラスの38行目にNullPointerExceptionが発生しています。これは、起動時の新しいゲームボタンのsetOnClickListenerです。画面。
関連セクションクラスWW3Activity:
public class WW3Activity extends Activity
{
public boolean DebugMode = false;
private String buildMenuEmplacement = "";
//[Initialization] Called when the app is first launched
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.startscreen);
//[Initialization] Makes the button resources available to the class
final Button newGame = (Button) findViewById(R.id.buttonNewGame);
final Button loadGame = (Button) findViewById(R.id.buttonLoadGame);
final Button exitGame = (Button) findViewById(R.id.buttonExit);
final Button about = (Button) findViewById(R.id.buttonAbout);
final Button troll = (Button) findViewById(R.id.buttonTroll);
final Button debug = (Button) findViewById(R.id.buttonDebug);
//[Action] When user pushes the New Game button
newGame.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
// Perform action on click
setContentView(R.layout.main);
buttonInitialize();
}
});
//[Action] When user pushes the Exit Game button
exitGame.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
// Perform action on click
finish();
}
});
//[Action] When user pushes the Debug Mode button
exitGame.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
// Perform action on click
DebugMode = true;
}
});
}
//[Initialization] Gets the emplacements ready to be pushed
public void buttonInitialize()
{
final ImageView pe1 = (ImageView) findViewById(R.id.playerEmplacement1);
final ImageView pe2 = (ImageView) findViewById(R.id.playerEmplacement2);
final ImageView pe3 = (ImageView) findViewById(R.id.playerEmplacement3);
final ImageView pc = (ImageView) findViewById(R.id.playerCity);
final ImageView ee1 = (ImageView) findViewById(R.id.enemyEmplacement1);
final ImageView ee2 = (ImageView) findViewById(R.id.enemyEmplacement2);
final ImageView ee3 = (ImageView) findViewById(R.id.enemyEmplacement3);
final ImageView ec = (ImageView) findViewById(R.id.enemyCity);
registerForContextMenu(findViewById(R.id.playerEmplacement1));
registerForContextMenu(findViewById(R.id.playerEmplacement2));
registerForContextMenu(findViewById(R.id.playerEmplacement3));
registerForContextMenu(findViewById(R.id.enemyEmplacement1));
registerForContextMenu(findViewById(R.id.enemyEmplacement2));
registerForContextMenu(findViewById(R.id.enemyEmplacement3));
/*empAction(pe1);
empAction(pe2);
empAction(pe3);
empAction(ee1);
empAction(ee2);
empAction(ee3);
empAction(ec);
empAction(pc);*/
}
そしてLogCat:
10-24 13:29:12.297: D/dalvikvm(440): GC_FOR_ALLOC freed 40K, 4% free 6356K/6595K, paused 177ms
10-24 13:29:12.303: I/dalvikvm-heap(440): Grow heap (frag case) to 6.653MB for 409616-byte allocation
10-24 13:29:12.503: D/dalvikvm(440): GC_FOR_ALLOC freed <1K, 5% free 6755K/7047K, paused 128ms
10-24 13:29:12.614: D/dalvikvm(440): GC_FOR_ALLOC freed 400K, 8% free 6762K/7303K, paused 57ms
10-24 13:29:12.663: D/AndroidRuntime(440): Shutting down VM
10-24 13:29:12.663: W/dalvikvm(440): threadid=1: thread exiting with uncaught exception (group=0x40014760)
10-24 13:29:12.683: E/AndroidRuntime(440): FATAL EXCEPTION: main
10-24 13:29:12.683: E/AndroidRuntime(440): Java.lang.RuntimeException: Unable to start activity ComponentInfo{edu.mbijou.cosc473.ww3/edu.mbijou.cosc473.ww3.WW3Activity}: Java.lang.NullPointerException
10-24 13:29:12.683: E/AndroidRuntime(440): at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:1815)
10-24 13:29:12.683: E/AndroidRuntime(440): at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:1831)
10-24 13:29:12.683: E/AndroidRuntime(440): at Android.app.ActivityThread.access$500(ActivityThread.Java:122)
10-24 13:29:12.683: E/AndroidRuntime(440): at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1024)
10-24 13:29:12.683: E/AndroidRuntime(440): at Android.os.Handler.dispatchMessage(Handler.Java:99)
10-24 13:29:12.683: E/AndroidRuntime(440): at Android.os.Looper.loop(Looper.Java:132)
10-24 13:29:12.683: E/AndroidRuntime(440): at Android.app.ActivityThread.main(ActivityThread.Java:4123)
10-24 13:29:12.683: E/AndroidRuntime(440): at Java.lang.reflect.Method.invokeNative(Native Method)
10-24 13:29:12.683: E/AndroidRuntime(440): at Java.lang.reflect.Method.invoke(Method.Java:491)
10-24 13:29:12.683: E/AndroidRuntime(440): at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:841)
10-24 13:29:12.683: E/AndroidRuntime(440): at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:599)
10-24 13:29:12.683: E/AndroidRuntime(440): at dalvik.system.NativeStart.main(Native Method)
10-24 13:29:12.683: E/AndroidRuntime(440): Caused by: Java.lang.NullPointerException
10-24 13:29:12.683: E/AndroidRuntime(440): at edu.mbijou.cosc473.ww3.WW3Activity.onCreate(WW3Activity.Java:38)
10-24 13:29:12.683: E/AndroidRuntime(440): at Android.app.Activity.performCreate(Activity.Java:4397)
10-24 13:29:12.683: E/AndroidRuntime(440): at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1048)
10-24 13:29:12.683: E/AndroidRuntime(440): at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:1779)
10-24 13:29:12.683: E/AndroidRuntime(440): ... 11 more
startscreen.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical" >
<ImageView
Android:id="@+id/logo"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignParentLeft="true"
Android:layout_alignParentTop="true"
Android:layout_marginLeft="493dp"
Android:layout_marginTop="217dp"
Android:src="@drawable/logo" >
</ImageView>
<Button
Android:id="@+id/buttonNewGame"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignParentLeft="true"
Android:layout_below="@+id/logo"
Android:layout_marginLeft="200dp"
Android:layout_marginTop="133dp"
Android:clickable="true"
Android:text="@string/bNewGame" >
</Button>
<Button
Android:id="@+id/buttonLoadGame"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignBottom="@+id/buttonNewGame"
Android:layout_alignLeft="@+id/buttonTroll"
Android:layout_alignRight="@+id/buttonTroll"
Android:clickable="true"
Android:text="@string/bLoadGame" >
</Button> <Button
Android:id="@+id/buttonExit"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignBaseline="@+id/buttonLoadGame"
Android:layout_alignBottom="@+id/buttonLoadGame"
Android:layout_alignLeft="@+id/buttonDebug"
Android:layout_alignRight="@+id/buttonDebug"
Android:layout_toRightOf="@+id/buttonLoadGame"
Android:clickable="true"
Android:text="@string/bExit" >
</Button>
<Button
Android:id="@+id/buttonAbout"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignLeft="@+id/buttonNewGame"
Android:layout_alignRight="@+id/buttonNewGame"
Android:layout_below="@+id/buttonNewGame"
Android:layout_marginTop="50dp"
Android:text="@string/bAbout" />
<Button
Android:id="@+id/buttonTroll"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignBaseline="@+id/buttonAbout"
Android:layout_alignBottom="@+id/buttonAbout"
Android:layout_centerHorizontal="true"
Android:text="@string/bTrollface" />
<Button
Android:id="@+id/buttonDebug"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignBottom="@+id/buttonTroll"
Android:layout_toRightOf="@+id/buttonTroll"
Android:layout_marginLeft="200dp"
Android:text="@string/bDebug" />
</RelativeLayout>
レイアウトビューをstartscreenに変更する前にボタンのセットを宣言したため、元々NullPointerExceptionが発生していましたが、それを修正したところ、これが発生しました。技術的にはこれIS宿題ですが、これは宿題のようなタイプの問題ではないため、宿題タグが必要だとは思いません。問題は実際の割り当てとは関係がないためです。自体。
findViewById()
がnull
を返す唯一の理由は、探しているビューが現在のビューに属していないためです。 (setContentView()
で設定したビュー)。 R.id.buttonNewGame
がR.layout.startscreen
にある場合は、プロジェクトをクリーンアップして再構築してみてください。
newGame
がnullのように見えます。 startscreen.xmlという名前のレイアウトが複数ありますか?この例外の一般的な原因は、一方のバージョンでbuttonNewGameを作成し、もう一方のバージョンでは作成しないことです。これにより、コードは正しくビルドされますが、アクティブなレイアウトでボタンを指定できなかった場合、説明どおりに実行時に失敗します。
このエラーは定期的に発生しますが、私の場合の問題は、Androidが異なるレイアウトで同じIDを不適切に維持していることです。IDが1つのレイアウト内だけでなく、アプリケーション全体で一意であることを確認してください。
38行目にブレークポイントを設定し、デバッガーを起動します。おそらく、NullPointerExceptionをスローするxmlファイルR.layout.startscreenの外部のボタンを参照しようとしています。