2014-10-01 110 views
-2

我構建了一個android應用程序,將微調投射到開關,以使用戶能夠選擇一個運算符進行計算並查看結果。Android應用程序強制關閉,找到java.lang.nullpointerexception

這是來自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 
} 

因爲它在呼喚着一個空的變量,我嘗試添加垃圾數據進的聲明op3是爲了解決我的問題。這被證明是不成功的。我看到一些例子通過在if語句中添加一個空值檢查來解決,但是我不認爲它適用於這裏。

回答

1

Documentation for getSelectedItem()

返回對應於當前選擇的項目的數據,或者如果沒有什麼選擇空。

當應用程序啓動時,沒有任何選擇。移動

op3 = operation.getSelectedItem() 

onClick()內,並試圖調用toString()對結果之前檢查!= null

+0

今天早上我把它移到了onclick()後面。它的工作,但仍然強制關閉。我發現nullpointerexception是因爲我沒有在微調器的.xml中聲明android:條目。 – mikeymop 2014-10-02 00:34:47

1

您還沒有爲微調器設置任何內容,因此operation.getSelectedItem()正在返回null。 NPE試圖然後致電toString()。在嘗試訪問項目之前先填充微調器,或者在嘗試檢索項目時至少放置一個空檢查。