Java 我收到一个错误,试图调用空引用上的方法,但我无法调试它
我跟随John Horton的《通过构建Android游戏学习Java》一书,对于它的第一个例子,数学游戏,我在运行时遇到以下错误 java.lang.NullPointerException:尝试调用虚拟方法“void” 空值上的android.widget.TextView.setText(java.lang.CharSequence)“” 对象引用 这是我的密码: 游戏活动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
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)。程序将在该行代码执行之前停止,调试窗口将包含变量的当前状态等信息。您还可以选择控制代码的进度。当然,如果未达到断点,则重新考虑您的调试策略。请在帖子中包含布局文件。您说您无法调试它-为什么不?什么阻止了你?我不太明白,就是这样。非常感谢。