我在 android 中开发一个游戏,你完成了四个问题的测试并返回主菜单,现在进入主菜单活动来测试活动没问题,但是每当我在测试活动中并试图通过完成返回主菜单时4 个问题或 onPressedBack() 函数或按对话框上的主菜单按钮,它会给我 NullPointerException。这是我的测试代码:
public class Test extends Activity implements OnClickListener{
TextView tvBorder, tvBorder2, tvOperation, tvRight, tvWrong, tvTotal, tvTimer;
Button bMcq1, bMcq2, bMcq3, bMcq4;
ImageButton ibMusic, ibPause;
Timer t;
MediaPlayer mp;
private String name;
private int difficulty;
private int ops[];
private int TotalCounter = 0;
private int TimeCounter = 0;
private int right = 0, wrong = 0;
private double answer = -1;
private boolean ispressed = false;
private Plus plus;
private Minus minus;
private Multi multi;
private Division div;
private RandomizedQueue<Integer> rd;
Random rand = new Random();
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
difficulty = getIntent().getExtras().getInt("Difficulty");
Log.d("test Difficulty 2", String.valueOf(difficulty));
ops = getIntent().getExtras().getIntArray("OPstring");
Log.d("OPS 2", String.valueOf(ops.length));
name = getIntent().getExtras().getString("Reference2");
Log.d("Reference2", name);
Initialize();
generateQuestions();
}
private void Initialize() {
// TODO Auto-generated method stub
mp = MediaPlayer.create(this, R.raw.game);
mp.setLooping(true);
mp.start();
tvBorder = (TextView) findViewById(R.id.border);
tvBorder2 = (TextView) findViewById(R.id.border2);
tvOperation = (TextView) findViewById(R.id.op);
tvRight = (TextView) findViewById(R.id.right);
tvWrong = (TextView) findViewById(R.id.wrong);
tvTotal = (TextView) findViewById(R.id.total);
tvTimer = (TextView) findViewById(R.id.timer);
bMcq1 = (Button) findViewById(R.id.mcq1);
bMcq2 = (Button) findViewById(R.id.mcq2);
bMcq3 = (Button) findViewById(R.id.mcq3);
bMcq4 = (Button) findViewById(R.id.mcq4);
ibMusic = (ImageButton) findViewById(R.id.music);
ibPause = (ImageButton) findViewById(R.id.pausemenu);
t = new Timer();
t.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
runOnUiThread(new Runnable() {
public void run() {
tvTimer.setText(String.valueOf(TimeCounter));
TimeCounter++;
}
});
}
}, 1000, 1000);
bMcq1.setOnClickListener(this);
bMcq2.setOnClickListener(this);
bMcq3.setOnClickListener(this);
bMcq4.setOnClickListener(this);
ibMusic.setOnClickListener(this);
ibPause.setOnClickListener(this);
}
private void generateQuestions() {
// TODO Auto-generated method stub
if(TotalCounter == 4)
{
Intent back = new Intent(Test.this, MainMenu.class);
startActivity(back);
}
plus = new Plus(difficulty);
minus = new Minus(difficulty);
multi = new Multi(difficulty);
div = new Division(difficulty);
rd = new RandomizedQueue<Integer>();
TotalCounter++;
tvTotal.setText(String.valueOf(TotalCounter));
int gen = rand.nextInt(ops.length);
Log.d("generated number", String.valueOf(gen));
int TheChosenOP = ops[gen];
Log.d("TheChosenOP", String.valueOf(TheChosenOP));
switch(TheChosenOP)
{
case 1:
Toast t = Toast.makeText(Test.this, "Plus", 5000);
t.show();
tvOperation.setText("+");
int i = plus.getBorder();
int j = plus.getBorder2();
tvBorder.setText(String.valueOf(i));
tvBorder2.setText(String.valueOf(j));
answer = plus.getAnswer();
SetAnswer(answer);
break;
case 2:
Toast t2 = Toast.makeText(Test.this, "Minus", 5000);
t2.show();
tvOperation.setText("-");
int i2 = minus.getBorder();
int j2 = minus.getBorder2();
tvBorder.setText(String.valueOf(i2));
tvBorder2.setText(String.valueOf(j2));
answer = minus.getAnswer();
SetAnswer(answer);
break;
case 3:
Toast t3 = Toast.makeText(Test.this, "Multi", 5000);
t3.show();
tvOperation.setText("*");
int i3 = multi.getBorder();
int j3 = multi.getBorder2();
tvBorder.setText(String.valueOf(i3));
tvBorder2.setText(String.valueOf(j3));
answer = multi.getAnswer();
SetAnswer(answer);
break;
case 4:
Toast t4 = Toast.makeText(Test.this, "Division", 5000);
t4.show();
tvOperation.setText("/");
int i4 = div.getBorder();
int j4 = div.getBorder2();
tvBorder.setText(String.valueOf(i4));
tvBorder2.setText(String.valueOf(j4));
answer = div.getAnswer();
SetAnswer(answer);
break;
}
}
private void SetAnswer(double answer) {
// TODO Auto-generated method stub
int firstchoice = (int) ((int) answer - ((answer * 10) / 100));
Log.d("Test", String.valueOf(firstchoice));
int secondchoice = (int) ((int) answer + Math.ceil(((answer * 10) / 100)));
int Thirdchoice;
if (difficulty == 1)
Thirdchoice = (int) answer + 2;
else
Thirdchoice = (int) ((int) answer + Math.ceil(((answer * 25) / 100)));
rd.enqueue((int) answer);
rd.enqueue(firstchoice);
rd.enqueue(secondchoice);
rd.enqueue(Thirdchoice);
bMcq1.setText(String.valueOf(rd.dequeue()));
bMcq2.setText(String.valueOf(rd.dequeue()));
bMcq3.setText(String.valueOf(rd.dequeue()));
bMcq4.setText(String.valueOf(rd.dequeue()));
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String ans;
switch(v.getId())
{
// setting Music
case R.id.music:
if (ispressed == false)
{
mp.pause();
ispressed = true;
}
else
{
mp.start();
ispressed = false;
}
break;
// setting Pause Menu
case R.id.pausemenu:
final Dialog d = new Dialog(this);
d.setTitle("Pause Menu");
d.setContentView(R.layout.pausemenu);
Button resume = (Button) d.findViewById(R.id.Resume);
Button Back = (Button) d.findViewById(R.id.Main);
resume.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
d.cancel();
mp.start();
}
});
Back.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent iback = new Intent();
iback.setClass(Test.this, MainMenu.class);
startActivity(iback);
}
});
mp.pause();
d.show();
break;
//setting answers:
case R.id.mcq1:
ans = (String) bMcq1.getText();
CheckAnswer(ans);
break;
case R.id.mcq2:
ans = (String) bMcq2.getText();
CheckAnswer(ans);
break;
case R.id.mcq3:
ans = (String) bMcq3.getText();
CheckAnswer(ans);
break;
case R.id.mcq4:
ans = (String) bMcq4.getText();
CheckAnswer(ans);
break;
}
}
private void CheckAnswer(String ans) {
// TODO Auto-generated method stub
if (Integer.parseInt(ans) == answer) {
Toast t = Toast.makeText(this, "True, Bravo!!!", 5000);
t.show();
//counter++;
right++;
tvRight.setText(String.valueOf(right));
generateQuestions();
} else {
Toast t = Toast.makeText(this,
"False, Go home u r drunk!!", 5000);
t.show();
wrong++;
tvWrong.setText(String.valueOf(wrong));
generateQuestions();
}
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
finish();
}
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
//mp.stop();
}
public void onBackPressed() {
//TODO Auto-generated method stub
super.onBackPressed();
startActivity(new Intent(this, MainMenu.class));
}
}
在 MainMenu 活动上 - 这很重要:
public class MainMenu extends Activity implements OnClickListener{
ImageButton ibEasy, ibIntermediate, ibHard, ibMusic, ibGo, ibTest, ibPractice, ibStatistic;
CheckBox cPlus, cMinus, cMulti, cDiv;
private int difficulty = 0;
private int operation = 0;
private int top = 0;
private boolean p = false, m = false, mu = false, d = false;
private boolean ispressed = false;
String name;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.mainmenu);
Initialize();
}
private void Initialize() {
// TODO Auto-generated method stub
ibEasy = (ImageButton) findViewById(R.id.imageButton1);
ibIntermediate = (ImageButton) findViewById(R.id.imageButton2);
ibHard = (ImageButton) findViewById(R.id.imageButton3);
ibMusic = (ImageButton) findViewById(R.id.imageButton4);
ibGo = (ImageButton) findViewById(R.id.imageButton5);
ibPractice = (ImageButton) findViewById(R.id.imageButton6);
ibTest = (ImageButton) findViewById(R.id.imageButton7);
ibStatistic = (ImageButton) findViewById(R.id.imageButton8);
//ibEasy.setPressed(true);
cPlus = (CheckBox) findViewById(R.id.checkBox1);
cMinus = (CheckBox) findViewById(R.id.checkBox2);
cMulti = (CheckBox) findViewById(R.id.checkBox3);
cDiv = (CheckBox) findViewById(R.id.checkBox4);
name = getIntent().getExtras().getString("Reference");
ibEasy.setOnClickListener(this);
ibIntermediate.setOnClickListener(this);
ibHard.setOnClickListener(this);
ibMusic.setOnClickListener(this);
ibGo.setOnClickListener(this);
ibTest.setOnClickListener(this);
ibPractice.setOnClickListener(this);
ibStatistic.setOnClickListener(this);
cPlus.setOnClickListener(this);
cMinus.setOnClickListener(this);
cMulti.setOnClickListener(this);
cDiv.setOnClickListener(this);
}
if (R.id.imageButton5 == v.getId() && top == 2 && difficulty > 0 && operation > 0 )
{
int[] ops = new int [operation];
ops = getoperation(ops);
Log.d("OPS", String.valueOf(ops.length));
Intent i = new Intent();
i.setClass(MainMenu.this, Test.class);
i.putExtra("Reference2", name);
i.putExtra("Difficulty", difficulty);
i.putExtra("OPstring", ops);
startActivity(i);
}
private int[] getoperation(int[] ops) {
// TODO Auto-generated method stub
int index = 0;
if (p == true)
{
ops[index] = 1;
index++;
}
if (m == true)
{
ops[index] = 2;
index++;
}
if(mu == true)
{
ops[index] = 3;
index++;
}
if (d == true)
{
ops[index] = 4;
index++;
}
return ops;
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
stopService(new Intent(MainMenu.this,SongService.class));
finish();
}
我的应用程序清单:
?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mathmemes"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.mathmemes.Logo"
android:label="@string/app_name"
android:screenOrientation="landscape" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.mathmemes.StartPoint"
android:label="@string/app_name"
android:screenOrientation="landscape" >
<intent-filter>
<action android:name="android.intent.action.StartPoint" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name="com.mathmemes.MainMenu"
android:label="@string/app_name"
android:screenOrientation="landscape" >
<intent-filter>
<action android:name="android.intent.action.MENU" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name="com.mathmemes.Test"
android:label="@string/app_name"
android:screenOrientation="landscape" >
<intent-filter>
<action android:name="android.intent.action.TEST" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name="com.mathmemes.Practice"
android:label="@string/app_name"
android:screenOrientation="landscape" >
<intent-filter>
<action android:name="android.intent.action.PRACTICE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name="com.mathmemes.Statistic"
android:label="@string/app_name"
android:screenOrientation="landscape" >
<intent-filter>
<action android:name="android.intent.action.STATISTIC" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<service android:enabled="true" android:name=".SongService"/>
</application>
这是我在 LOGCAT 上的错误异常:
06-01 10:40:43.757: W/InputManagerService(58):
Got RemoteException sending setActive(false) notification to pid 311 uid 10036
06-01 10:40:44.758: W/NotificationService(58):
Object died trying to hide notification
android.app.ITransientNotification$Stub$Proxy@45f43aa0 in package com.mathmemes
06-01 10:40:44.758: W/ActivityManager(58):
setProcessForeground called on unknown pid: 311
06-01 10:40:44.758: W/NotificationService(58):
Object died trying to show notification
android.app.ITransientNotification$Stub$Proxy@45f4d090 in package com.mathmemes
06-01 10:40:44.758: W/ActivityManager(58):
setProcessForeground called on unknown pid: 311
06-01 10:40:44.758: W/NotificationService(58):
Object died trying to show notification
android.app.ITransientNotification$Stub$Proxy@45f344d8 in package com.mathmemes
06-01 10:40:44.767: W/ActivityManager(58):
setProcessForeground called on unknown pid: 311
06-01 10:40:44.767: W/NotificationService(58):
Object died trying to show notification
android.app.ITransientNotification$Stub$Proxy@45f317f0 in package com.mathmemes
06-01 10:40:44.767: W/ActivityManager(58):
setProcessForeground called on unknown pid: 311
06-01 10:44:28.064: D/SntpClient(58):
request time failed: java.net.SocketException:
Address family not supported by protocol
06-01 10:49:28.074: D/SntpClient(58):
request time failed: java.net.SocketException:
Address family not supported by protocol
06-01 10:54:28.090: D/SntpClient(58):
request time failed: java.net.SocketException:
Address family not supported by protocol
06-01 10:59:28.130: D/SntpClient(58):
request time failed: java.net.SocketException:
Address family not supported by protocol
06-01 11:04:28.141: D/SntpClient(58):
request time failed: java.net.SocketException:
Address family not supported by protocol
06-01 10:26:28.517: E/AndroidRuntime(271): FATAL EXCEPTION: main
06-01 10:26:28.517: E/AndroidRuntime(271): java.lang.RuntimeException:
Unable to start activity ComponentInfo{com.mathmemes/com.mathmemes.MainMenu}:
java.lang.NullPointerException
06-01 10:26:28.517: E/AndroidRuntime(271):
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
06-01 10:26:28.517: E/AndroidRuntime(271):
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
06-01 10:26:28.517: E/AndroidRuntime(271):
at android.app.ActivityThread.access$2300(ActivityThread.java:125)
06-01 10:26:28.517: E/AndroidRuntime(271):
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
06-01 10:26:28.517: E/AndroidRuntime(271):
at android.os.Handler.dispatchMessage(Handler.java:99)
06-01 10:26:28.517: E/AndroidRuntime(271):
at android.os.Looper.loop(Looper.java:123)
06-01 10:26:28.517: E/AndroidRuntime(271):
at android.app.ActivityThread.main(ActivityThread.java:4627)
06-01 10:26:28.517: E/AndroidRuntime(271):
at java.lang.reflect.Method.invokeNative(Native Method)
06-01 10:26:28.517: E/AndroidRuntime(271):
at java.lang.reflect.Method.invoke(Method.java:521)
06-01 10:26:28.517: E/AndroidRuntime(271):
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
06-01 10:26:28.517: E/AndroidRuntime(271):
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
06-01 10:26:28.517: E/AndroidRuntime(271):
at dalvik.system.NativeStart.main(Native Method)
06-01 10:26:28.517: E/AndroidRuntime(271):
Caused by: java.lang.NullPointerException
06-01 10:26:28.517: E/AndroidRuntime(271):
at com.mathmemes.MainMenu.Initialize(MainMenu.java:55)
06-01 10:26:28.517: E/AndroidRuntime(271):
at com.mathmemes.MainMenu.onCreate(MainMenu.java:34)
06-01 10:26:28.517: E/AndroidRuntime(271):
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
06-01 10:26:28.517: E/AndroidRuntime(271):
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
06-01 10:26:28.517: E/AndroidRuntime(271):
... 11 more
我真的不知道为什么它不起作用我在另一个项目中尝试了类似的代码并且它起作用了所以我不知道我哪里出错了。
感谢您的考虑和时间。对不起,我的英语不好。