Java Android:分配按钮id时获取空值

Java Android:分配按钮id时获取空值,java,android,Java,Android,我正在制作一个简单的3x3网格类型的应用程序,当我单击一个按钮时,最后单击的按钮是“”,而我刚刚单击的按钮是“!”。然而,我不断地得到错误 java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null object reference 代码如下:package com.example.rya

我正在制作一个简单的3x3网格类型的应用程序,当我单击一个按钮时,最后单击的按钮是“”,而我刚刚单击的按钮是“!”。然而,我不断地得到错误

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View 
android.view.Window.findViewById(int)' on a null object reference
代码如下:package com.example.ryanfolz.gridgame

import android.content.Context;
import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;


public class GameActivity extends ActionBarActivity {

private Context ctx;
public int j = 1;
public int i = 1;
public final int[][] buttons = new int[][] {
        {R.id.top_left_button, R.id.top_center_button, R.id.top_right_button},
        {R.id.left_button, R.id.center_button, R.id.right_button},
        {R.id.bottom_left_button, R.id.bottom_center_button, R.id.bottom_right_button}};
private Button lastButton;

public void setPlayer(Button button){
    lastButton = (Button)findViewById(R.id.center_button);
    button.setText("!");
    lastButton.setText(" ");
    lastButton = button;

}


@Override


protected void onCreate(Bundle savedInstanceState) {


    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_game);


    ctx = this;

    final GameEngine game = new GameEngine();
    lastButton = (Button)findViewById(R.id.center_button);
    for (i = 0; i < buttons.length; i++) {
        for (j = 0; j < buttons[i].length; j++) {
            final Button button = (Button)findViewById(buttons[i][j]);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Button b = (Button)v;
                    game.updatePlayer(b);
                }
            });
        }
    }

    Button backButton = (Button)findViewById(R.id.back_button);
    backButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent gotoMenu = new Intent(ctx, MainActivity.class);
            startActivity(gotoMenu);

        }
    });
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_game, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}
}
日志cat是这样的:

01-07 15:52:38.892    1929-1929/com.example.ryanfolz.gridgame E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.ryanfolz.gridgame, PID: 1929
    java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null object reference
            at android.app.Activity.findViewById(Activity.java:2071)
            at com.example.ryanfolz.gridgame.GameActivity.setPlayer(GameActivity.java:25)
            at com.example.ryanfolz.gridgame.GameEngine.updatePlayer(GameEngine.java:21)
            at com.example.ryanfolz.gridgame.GameActivity$1.onClick(GameActivity.java:54)
            at android.view.View.performClick(View.java:4756)
            at android.view.View$PerformClick.run(View.java:19749)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
01-07 15:52:40.775    2285-2300/com.example.ryanfolz.gridgame D/OpenGLRenderer﹕ Render dirty regions requested: true
01-07 15:52:40.778    2285-2285/com.example.ryanfolz.gridgame D/﹕ HostConnection::get() New Host Connection established 0xa6c4a590, tid 2285
01-07 15:52:40.873    2285-2285/com.example.ryanfolz.gridgame D/Atlas﹕ Validating map...
谢谢你的帮助

}
`我认为问题在于:

GameActivity game = new GameActivity();
public void updatePlayer(Button buttonID){
    game.setPlayer(buttonID);
}
您通过直接调用构造函数来创建
GameActivity
,而不是由Android系统本身构建。我猜想这意味着你会发现,
onCreate
没有被调用,所以你从来没有夸大过你的布局。如果没有布局,就没有任何视图可供查看


现在还不清楚你为什么要自己构建一个活动,但我建议你应该尝试找到一个替代设计,让你能够根据你的环境获取相关的活动——一个其他安卓系统以正常方式“了解”的活动。

我相信问题在这里:

GameActivity game = new GameActivity();
public void updatePlayer(Button buttonID){
    game.setPlayer(buttonID);
}
您通过直接调用构造函数来创建
GameActivity
,而不是由Android系统本身构建。我猜想这意味着你会发现,
onCreate
没有被调用,所以你从来没有夸大过你的布局。如果没有布局,就没有任何视图可供查看


现在还不清楚你为什么要自己构建一个活动,但我建议你应该尝试找到一个替代设计,让你可以根据你的上下文获取相关的活动——一个安卓系统其他部分以正常方式“知道”的活动。

你不会像那样实例化活动。您需要通过Intent启动活动,它不是标准对象。请找到其他解决方案,或将
updatePlayer()
移动到
GameActivity
。你不能像现在这样实例化活动。你不能像那样实例化活动。您需要通过Intent启动活动,它不是标准对象。请找到其他解决方案,或将
updatePlayer()
移动到
GameActivity
。您不能像现在这样实例化活动。