我构建了一个将微调器强制转换为开关的Android应用程序,使用户可以选择运算符进行计算并查看结果。
它来自Android Boot Camp课程。我很不高兴找到我的应用程序没有编译错误,但坠毁,机上启动。当我运行应用程序时,我正在观察logcat,发现nullpointer异常在第40行。我将spinner的选择拉到字符串变量。
//spinner
op3 = operation.getSelectedItem().toString();
我将logcat的内容转储到文本文件中。以下是我认为相关的内容。
09-30 22:26:58.401: E/AndroidRuntime(1565): FATAL EXCEPTION: main
09-30 22:26:58.401: E/AndroidRuntime(1565): Process: com.schmop.flashmath, PID: 1565
09-30 22:26:58.401: E/AndroidRuntime(1565): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.schmop.flashmath/com.schmop.flashmath.MainActivity}: java.lang.NullPointerException
and
**09-30 22:26:58.401: E/AndroidRuntime(1565): Caused by: java.lang.NullPointerException
09-30 22:26:58.401: E/AndroidRuntime(1565): at** com.schmop.flashmath.MainActivity.onCreate(MainActivity.java:40)
09-30 22:26:58.401: E/AndroidRuntime(1565): at android.app.Activity.performCreate(Activity.java:5231)
09-30 22:26:58.401: E/AndroidRuntime(1565): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
09-30 22:26:58.401: E/AndroidRuntime(1565): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
09-30 22:26:58.401: E/AndroidRuntime(1565): ... 11 more
以下是
中mainActivity的内容MainActivity.java
public class MainActivity extends ActionBarActivity {
int number1;
int number2;
int result;
int op1;
int op2;
String op3 = null;
int calculator;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText first = (EditText)findViewById(R.id.num);
final EditText second = (EditText)findViewById(R.id.num2);
final Spinner operation = (Spinner)findViewById(R.id.operator);
final Button equals = (Button)findViewById(R.id.button1);
final TextView t = (TextView)findViewById(R.id.result);
operation.setSelection(0);
//spinner
op3 = operation.getSelectedItem().toString();
//start logic
//onclick listener
equals.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//gettext
number1 = Integer.parseInt(first.getText().toString());
number2 = Integer.parseInt(second.getText().toString());
if(number1 < 21 && number1 > 0 && number2 < 21 && number2 > 0) {
//switch
switch(calculator) {
case 1: op3 = "+";
calculator = number1 + number2;
break;
case 2: op3 = "-";
calculator = number1 - number2;
break;
case 3: op3 = "x";
calculator = number1 * number2;
break;
}
} else {
t.setText("Error: One of your Numbers is out of Range");
}
t.setText(number1 + op3 + number2 + "=" + calculator);
}
});
//end logic
}
由于它正在调用一个null变量,我尝试将垃圾数据添加到op3的声明中,以尝试修复我的问题。事实证明这是不成功的。我已经看到一些例子通过在if语句中添加null检查来解决,但我认为它不适用于此。
答案 0 :(得分:1)
Documentation for getSelectedItem()
:
返回与当前所选项对应的数据,如果没有选择任何内容,则返回null。
当应用程序启动时,尚未选择任何内容。移动
op3 = operation.getSelectedItem()
在onClick()
内找到!= null
并检查toString()
,然后尝试在结果上调用{{1}}。
答案 1 :(得分:1)
您尚未为微调器设置任何内容,因此operation.getSelectedItem()
正在返回null
。 NPE试图然后调用toString()
。在尝试访问项目之前首先填充您的微调器,或者在尝试检索项目时至少进行空检查。