Java 我收到一个错误,试图调用空引用上的方法,但我无法调试它

Java 我收到一个错误,试图调用空引用上的方法,但我无法调试它,java,android,Java,Android,我跟随John Horton的《通过构建Android游戏学习Java》一书,对于它的第一个例子,数学游戏,我在运行时遇到以下错误 java.lang.NullPointerException:尝试调用虚拟方法“void” 空值上的android.widget.TextView.setText(java.lang.CharSequence)“” 对象引用 这是我的密码: 游戏活动 package com.example.mike.mathgame; import android.app.Acti

我跟随John Horton的《通过构建Android游戏学习Java》一书,对于它的第一个例子,数学游戏,我在运行时遇到以下错误

java.lang.NullPointerException:尝试调用虚拟方法“void” 空值上的android.widget.TextView.setText(java.lang.CharSequence)“” 对象引用

这是我的密码:

游戏活动

package com.example.mike.mathgame;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;

public class GameActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Loads up UI
        setContentView(R.layout.activity_main);

        int partA = 2;
        int partB = 3;
        int correctAnswer = partA * partB;
        int wrongAnswer1 = correctAnswer - 1;
        int wrongAnswer2 = correctAnswer + 1;

        TextView textObjectPartA = (TextView)findViewById(R.id.textPartA);
        TextView textObjectPartB = (TextView)findViewById(R.id.textPartB);
        Button buttonObjectChoice1 = (Button)findViewById(R.id.buttonChoice1);
        Button buttonObjectChoice2 = (Button)findViewById(R.id.buttonChoice2);
        Button buttonObjectChoice3 = (Button)findViewById(R.id.buttonChoice3);

        textObjectPartA.setText("" + partA);
        textObjectPartB.setText("" + partB);

        buttonObjectChoice1.setText("" + correctAnswer);
        buttonObjectChoice2.setText("" + wrongAnswer1);
        buttonObjectChoice3.setText("" + wrongAnswer2);



    }
}
package com.example.mike.mathgame;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;


public class MainActivity extends Activity implements View.OnClickListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final Button buttonPlay = (Button)findViewById(R.id.buttonPlay);
        buttonPlay.setOnClickListener(this);
    }

    @Override
    public void onClick(View view){
        Intent i;
        i = new Intent(this, GameActivity.class);
        startActivity(i);
    }
}
主要活动

package com.example.mike.mathgame;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;

public class GameActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Loads up UI
        setContentView(R.layout.activity_main);

        int partA = 2;
        int partB = 3;
        int correctAnswer = partA * partB;
        int wrongAnswer1 = correctAnswer - 1;
        int wrongAnswer2 = correctAnswer + 1;

        TextView textObjectPartA = (TextView)findViewById(R.id.textPartA);
        TextView textObjectPartB = (TextView)findViewById(R.id.textPartB);
        Button buttonObjectChoice1 = (Button)findViewById(R.id.buttonChoice1);
        Button buttonObjectChoice2 = (Button)findViewById(R.id.buttonChoice2);
        Button buttonObjectChoice3 = (Button)findViewById(R.id.buttonChoice3);

        textObjectPartA.setText("" + partA);
        textObjectPartB.setText("" + partB);

        buttonObjectChoice1.setText("" + correctAnswer);
        buttonObjectChoice2.setText("" + wrongAnswer1);
        buttonObjectChoice3.setText("" + wrongAnswer2);



    }
}
package com.example.mike.mathgame;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;


public class MainActivity extends Activity implements View.OnClickListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final Button buttonPlay = (Button)findViewById(R.id.buttonPlay);
        buttonPlay.setOnClickListener(this);
    }

    @Override
    public void onClick(View view){
        Intent i;
        i = new Intent(this, GameActivity.class);
        startActivity(i);
    }
}
内容\游戏

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.example.mike.mathgame.GameActivity"
tools:showIn="@layout/activity_game">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="2"
    android:id="@+id/textPartA"
    android:layout_marginTop="83dp"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="x"
    android:id="@+id/textOperator"
    android:layout_alignTop="@+id/textPartA"
    android:layout_centerHorizontal="true" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="2"
    android:id="@+id/textPartB"
    android:layout_alignTop="@+id/textOperator"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="="
    android:id="@+id/textView2"
    android:layout_marginTop="64dp"
    android:layout_below="@+id/textOperator"
    android:layout_alignLeft="@+id/textOperator"
    android:layout_alignStart="@+id/textOperator" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="4"
    android:id="@+id/buttonChoice1"
    android:layout_centerVertical="true"
    android:layout_centerHorizontal="true" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="5"
    android:id="@+id/buttonChoice2"
    android:layout_below="@+id/buttonChoice1"
    android:layout_alignLeft="@+id/buttonChoice1"
    android:layout_alignStart="@+id/buttonChoice1" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="6"
    android:id="@+id/buttonChoice3"
    android:layout_below="@+id/buttonChoice2"
    android:layout_centerHorizontal="true" />
<?xml version="1.0" encoding="utf-8"?>

活动\游戏

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.example.mike.mathgame.GameActivity"
tools:showIn="@layout/activity_game">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="2"
    android:id="@+id/textPartA"
    android:layout_marginTop="83dp"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="x"
    android:id="@+id/textOperator"
    android:layout_alignTop="@+id/textPartA"
    android:layout_centerHorizontal="true" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="2"
    android:id="@+id/textPartB"
    android:layout_alignTop="@+id/textOperator"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="="
    android:id="@+id/textView2"
    android:layout_marginTop="64dp"
    android:layout_below="@+id/textOperator"
    android:layout_alignLeft="@+id/textOperator"
    android:layout_alignStart="@+id/textOperator" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="4"
    android:id="@+id/buttonChoice1"
    android:layout_centerVertical="true"
    android:layout_centerHorizontal="true" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="5"
    android:id="@+id/buttonChoice2"
    android:layout_below="@+id/buttonChoice1"
    android:layout_alignLeft="@+id/buttonChoice1"
    android:layout_alignStart="@+id/buttonChoice1" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="6"
    android:id="@+id/buttonChoice3"
    android:layout_below="@+id/buttonChoice2"
    android:layout_centerHorizontal="true" />
<?xml version="1.0" encoding="utf-8"?>



在GameActivity中使用findViewById()时,至少有一个视图找不到。检查每一个的空值

在查看代码时,会弹出一条消息,GameActivity中的这一行可能是错误的:
setContentView(R.layout.activity\u main)

尽管您已修复该问题。你说你不能调试它。因此,您可能没有什么调试经验。基本上,这包括在各个点添加代码,并检查代码是否按照您的意愿执行

我对Eclipse不太确定,但安卓Studio确实让这变得非常简单。然而,首先,你怎么能不这样做

显然,Main活动首先被调用,当调用时,onCreate方法将被调用。从该信息开始,可以添加一条可见(日志)消息的编码。因此,我们在主活动开始后立即添加一些代码,即紧跟在onCreate语句之后,如下所示:-

    protected void onCreate(Bundle savedInstanceState) {
        Log.e("MYGAME","B4 super.onCcreate reached OK.");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final Button buttonPlay = (Button)findViewById(R.id.buttonPlay);
        buttonPlay.setOnClickListener(this);
    }
如果您运行该应用程序,您将获得以下信息:-

05-26 16:29:04.250 1828-1828/mike09215.app001 E/MYGAME:B4 super.oncreate已达到OK

在日志中,如果到达该行代码。如果你没有,那么你知道程序在那一行之前失败了。这是调试的核心原则

Android Studio使这项工作变得更加容易。只需单击代码左侧的列(行号所在的位置),即可插入一个断点。不是在行号上,而是在行号和代码之间,而是在列内。将出现一个红色圆圈


不要使用绿色箭头运行应用程序,而是通过单击绿色小错误来运行它(运行箭头旁边)(运行/调试应用程序或Shift F9)。程序将在该行代码执行之前停止,调试窗口将包含变量的当前状态等信息。您还可以选择控制代码的进度。当然,如果未达到断点,则重新考虑您的调试策略。

请在帖子中包含布局文件。您说您无法调试它-为什么不?什么阻止了你?我不太明白,就是这样。非常感谢。