Android App强制关闭,找到了java.lang.nullpointerexception

时间:2014-10-01 05:53:23

标签: android debugging

我构建了一个将微调器强制转换为开关的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检查来解决,但我认为它不适用于此。

2 个答案:

答案 0 :(得分:1)

Documentation for getSelectedItem()

  

返回与当前所选项对应的数据,如果没有选择任何内容,则返回null。

当应用程序启动时,尚未选择任何内容。移动

op3  = operation.getSelectedItem()
onClick()内找到!= null并检查toString(),然后尝试在结果上调用{{1}}。

答案 1 :(得分:1)

您尚未为微调器设置任何内容,因此operation.getSelectedItem()正在返回null。 NPE试图然后调用toString()。在尝试访问项目之前首先填充您的微调器,或者在尝试检索项目时至少进行空检查。