11

我正在为人工智能学期项目编写一个 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

启动屏幕.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>

我最初有一个 NullPointerException,因为我在将布局视图更改为 startscreen 之前声明了一组按钮,但我修复了它,然后发生了这种情况。从技术上讲,这是家庭作业,但我不认为它需要家庭作业标签,因为这不是家庭作业类型的问题,因为问题与实际作业本身无关。

4

4 回答 4

31

findViewById()返回的唯一原因null是您要查找的视图不属于当前视图。(您使用 设置的视图setContentView())。如果 R.id.buttonNewGame在 中R.layout.startscreen,请尝试清理并重建您的项目。

于 2011-10-24T13:50:39.117 回答
2

这似乎newGame是空的。您是否有多个名为 startscreen.xml 的布局?此异常的常见原因是在一个版本中创建 buttonNewGame 而不是在另一个版本中;当活动布局未能指定按钮时,这将导致代码正确构建但在运行时失败,正如您所描述的那样。

于 2011-10-24T13:50:18.220 回答
0

我会定期看到这个错误,我的问题是android在不同的布局中不正确地维护相同的id。确保您的 id 不仅在一个布局中,而且在整个应用程序中都是唯一的。

于 2011-10-24T13:52:03.710 回答
0

在第 38 行设置断点并启动调试器。您很可能试图引用 xml 文件 R.layout.startscreen 之外的按钮,这会引发 NullPointerException。

于 2011-10-24T13:53:05.650 回答