【发布时间】:2019-11-04 17:09:28
【问题描述】:
我正在 android studio 上创建一个测验应用程序。我需要在提交时显示带有用户分数的祝酒词。我想在 submitOnClick 方法中调用我的 calculateScore 方法,但 calculateScore 方法会使应用程序崩溃。
如果我在提交中调用 calculateScore,应用程序崩溃,如果我调用它 onClick,应用程序崩溃。
我的代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Button button = findViewById(R.id.submit);
button.setOnClickListener(submitOnClick);
}
final View.OnClickListener submitOnClick = new View.OnClickListener() {
@Override
public void onClick(View v) {
calculateScore();
Toast.makeText(MainActivity.this, "Your score is " + score, Toast.LENGTH_LONG).show();
}
};
public void checkQuestion1(View view) {
boolean checked = ((RadioButton) view).isChecked();
// Check which radio button was clicked
switch (view.getId()) {
case R.id.right:
if (checked)
score += 1;
break;
case R.id.wrong:
if (checked)
score += 0;
break;
}
}
public void checkQuestion2(View view) {
CheckBox function = findViewById(R.id.checkbox_function);
CheckBox undefined = findViewById(R.id.checkbox_undefined);
CheckBox booleans = findViewById(R.id.checkbox_booleans);
boolean isCheckedFunction = function.isChecked();
boolean isCheckedUndefined = undefined.isChecked();
boolean isCheckedBooleans = booleans.isChecked();
if (isCheckedUndefined && isCheckedBooleans && !isCheckedFunction) {
score += 1;
} else {
score += 0;
}
}
public void checkQuestion3(View view) {
EditText userInput = findViewById(R.id.inputAnswer);
String name = userInput.getText().toString();
if (name.trim().equalsIgnoreCase("Class")) {
score += 1;
} else {
score += 0;
}
}
public void checkQuestion4(View view) {
boolean checked = ((RadioButton) view).isChecked();
switch (view.getId()) {
case R.id.correct:
if (checked)
score += 1;
break;
case R.id.incorrect:
if (checked)
score += 0;
break;
}
}
public void checkQuestion5(View view) {
CheckBox correctOne = findViewById(R.id.checkbox_correct_one);
CheckBox correctTwo = findViewById(R.id.checkbox_correct_two);
CheckBox incorrectOne = findViewById(R.id.checkbox_incorrect_one);
CheckBox incorrectTwo = findViewById(R.id.checkbox_incorrect_two);
boolean isCheckedCorrectOne = correctOne.isChecked();
boolean isCheckedCorrectTwo = correctTwo.isChecked();
boolean isCheckedIncorrectOne = incorrectOne.isChecked();
boolean isCheckedIncorrectTwo = incorrectTwo.isChecked();
if (isCheckedCorrectOne && isCheckedCorrectTwo && !isCheckedIncorrectOne & !isCheckedIncorrectTwo) {
score += 1;
} else {
score += 0 ;
}
}
public void calculateScore(){
checkQuestion2(null);
checkQuestion1(null );
checkQuestion3(null);
checkQuestion4(null);
checkQuestion5(null);
}
日志猫: --------- 崩溃开始
2019-11-04 10:09:57.514 11886-11886/com.example.android.quizzapp E/AndroidRuntime: 致命异常: main 进程:com.example.android.quizzapp,PID:11886 java.lang.NullPointerException:尝试在空对象上调用虚拟方法“boolean android.widget.CompoundButton.isChecked()” 参考 在 com.example.android.quizzapp.MainActivity.checkQuestion1(MainActivity.java:39) 在 com.example.android.quizzapp.MainActivity.calculateScore(MainActivity.java:122) 在 com.example.android.quizzapp.MainActivity$1.onClick(MainActivity.java:32) 在 android.view.View.performClick(View.java:5610) 在 android.view.View$PerformClick.run(View.java:22265) 在 android.os.Handler.handleCallback(Handler.java:751) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6077) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
【问题讨论】:
-
发布您的日志猫。所以我们可以看看你得到的错误。
-
刚刚添加了日志
-
作为错误状态,它是一个空指针。你将它指向一个什么都不存在的地方(null)。这个
CompoundButton存在吗?看看