2014-09-05 72 views
0

這裏是我的onCreate()方法:的Andorid:無法恢復活動由於NullPointerException異常

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     currentMeasurementType = DEFAULT_TYPE; 

     final DataBaseHandler handler = new DataBaseHandler(getApplicationContext()); 
     SQLiteDatabase db = handler.getWritableDatabase(); 

     //Spinner for the measurement types 
     final Spinner measurementTypesSpinner = (Spinner) findViewById(R.id.MeasurementTypes); 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, 
       handler.getMeasurementTypes()); 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_item); 
     measurementTypesSpinner.setAdapter(adapter); 
     measurementTypesSpinner.setOnItemSelectedListener(this); 

     //Spinner for the measurement sub types 
     final Spinner measurementSubTypesSpinner = (Spinner) findViewById(R.id.MeasurementSubValues); 
     try { 
      ArrayAdapter<String> subAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, 
        handler.getMeasurementSubType(DEFAULT_TYPE)); 
      subAdapter.setDropDownViewResource(android.R.layout.simple_spinner_item); 
      measurementSubTypesSpinner.setAdapter(subAdapter); 
      //measurementSubTypesSpinner.setOnItemSelectedListener(this); TODO 
     } catch(NonExistentMeasurementTypeException ex) { 
      Log.d("failed to initialise the spinner for the measurement units", ex.getMessage()); 
     } 

     //the value from which the user is converting from 
     EditText value = (EditText) findViewById(R.id.unit_value); 
     value.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { 

      } 

      @Override 
      public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { 
       unitValue = charSequence.toString(); 
       MeasurementType mType = 
         MeasurementType.getMeasurementType(measurementTypesSpinner.getSelectedItem().toString()); 
       String unitName = measurementSubTypesSpinner.getSelectedItem().toString(); 
       String unitValue = charSequence.toString(); 

       //create the converter 
       Converter converter = new Converter(mType, unitName, unitValue); 
       //convert the values 
       ArrayList<Unit> convertedValues = converter.convert(); 
       //update the list view adapter 
       updateUnitAdapter(convertedValues); 
      } 

      @Override 
      public void afterTextChanged(Editable editable) { 
       //nothing here 
      } 
     }); 

     //ListView 
     ListView unitsView = (ListView) findViewById(R.id.units_list); 
     unitsView.setItemsCanFocus(true); 
     MeasurementType type = handler.getMeasurementType(DEFAULT_TYPE); 
     final ArrayList<Unit> unitsConverted = new ArrayList<Unit>(); 
     unitsConverted.addAll(Arrays.asList(type.getUnits())); 
     /**for some reason we need to do a clean up 
     * also going to set the unit values to zero 
     * for initialisation 
     */ 
     for(Unit u : unitsConverted) { 
      if(u == null) { 
       unitsConverted.remove(u); 
      } else { 
       u.setValue(0.00); 
      } 
     } 
     unitAdapter = new UnitListAdapter(this, unitsConverted, type); 
     unitsView.setAdapter(unitAdapter); 

     Button editList = (Button) findViewById(R.id.editList); 
     editList.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       ArrayList<Unit> units = handler.getUnitsList(currentMeasurementType); 
       Intent i = new Intent(getApplicationContext(), MeasurementTypeListActivity.class); 
       i.putParcelableArrayListExtra("units", units); 
       i.putExtra("measurementType", currentMeasurementType); 
       startActivity(i); 
      } 
     }); 

    } 

這裏是我的onResume()方法:

@Override 
    protected void onResume() { 
     super.onResume(); 

     SharedPreferences prefs = this.getSharedPreferences(
       "unitconverter", Context.MODE_PRIVATE); 

     DataBaseHandler handler = new DataBaseHandler(getApplicationContext()); 

     //set the spinner for measurement type 
     Spinner measurementTypeSpinner = (Spinner) findViewById(R.id.MeasurementTypes); 
     ArrayAdapter adapter = (ArrayAdapter) measurementTypeSpinner.getAdapter(); 
     int typePos = adapter.getPosition(prefs.getString("currentmeasurementtype", "acceleration")); 
     measurementTypeSpinner.setSelection(typePos); 

     //set the spinner for the measurement unit 
     Spinner measurementUnitSpinner = (Spinner) findViewById(R.id.MeasurementSubValues); 
     ArrayAdapter arrayAdapter = (ArrayAdapter) measurementUnitSpinner.getAdapter(); 
     int unitPos = arrayAdapter.getPosition(prefs.getString("currentmeasurementunit", "centigal")); 
     measurementUnitSpinner.setSelection(unitPos); 

     //set the value 
     EditText value = (EditText) findViewById(R.id.unit_value); 
     value.setText(prefs.getString("value", "0.00")); 

     /** 
     * The list view stuff 
     */ 
     ListView unitsList = (ListView) findViewById(R.id.units_list); 
     unitsList.setItemsCanFocus(true); 
     MeasurementType mType = handler.getMeasurementType(prefs.getString("currentmeasurementtype", "acceleration")); 
     //create the converter 
     Converter converter = new Converter(MeasurementType.getMeasurementType(prefs.getString("currentmeasurementtype", "acceleration")), prefs.getString("currentmeasurementunit", "centigal"), prefs.getString("value", "0.00")); 
     //convert the values 
     ArrayList<Unit> convertedValues = converter.convert(); 

     //update the current adapter 
     updateUnitAdapter(convertedValues); 
    } 

這裏是堆棧跟蹤:

java.lang.RuntimeException: Unable to resume activity {com.example.UnitConverter/com.example.UnitConverter.MyActivity}: java.lang.NullPointerException 
      at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2788) 
      at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2817) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2250) 
      at android.app.ActivityThread.access$800(ActivityThread.java:135) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:136) 
      at android.app.ActivityThread.main(ActivityThread.java:5017) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
      at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.NullPointerException 
      at com.example.UnitConverter.MyActivity$1.onTextChanged(MyActivity.java:78) 
      at android.widget.TextView.sendOnTextChanged(TextView.java:7408) 
      at android.widget.TextView.setText(TextView.java:3816) 
      at android.widget.TextView.setText(TextView.java:3671) 
      at android.widget.EditText.setText(EditText.java:80) 
      at android.widget.TextView.setText(TextView.java:3646) 
      at com.example.UnitConverter.MyActivity.onResume(MyActivity.java:243) 
      at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1192) 
      at android.app.Activity.performResume(Activity.java:5310) 
      at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2778) 
            at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2817) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2250) 
            at android.app.ActivityThread.access$800(ActivityThread.java:135) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:136) 
            at android.app.ActivityThread.main(ActivityThread.java:5017) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:515) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
            at dalvik.system.NativeStart.main(Native Method) 

所以它試圖做到這一點:

at com.example.UnitConverter.MyActivity$1.onTextChanged(MyActivity.java:78) 

之後它放在這裏:

at com.example.UnitConverter.MyActivity.onResume(MyActivity.java:243) 

當我看行78,我可以看到這一點:

String unitName = measurementSubTypesSpinner.getSelectedItem().toString(); 

所以它試圖設置這個變量,它看起來像它要去242線做這件事,242線讀取:

EditText value = (EditText) findViewById(R.id.unit_value); 
value.setText(prefs.getString("value", "0.00")); 

Thes e實際上是241和242行,建議我沒有初始化EditText。但我的想法是,試圖從首選項獲取字符串返回空...因爲它可能沒有被保存...

請有人看看?

+0

您必須在onCreate()而不是onResume()中找到所有視圖。 – 2014-09-05 06:09:17

+0

@HareshChhelana對不起,我不明白:「你的全部觀點」,請你解釋一下嗎? – user2405469 2014-09-05 06:12:54

+0

就像你是findViewId()在onResume()所以嘗試findViewId()EditText ListView等onCreate()當您的活動創建時,第一次調用onResume()多次調用,當你再次來到另一個活動的活動。 – 2014-09-05 06:25:27

回答

0

the docs for getSelectedItem

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

我的猜測是,你的微調已經沒有選擇,所以你得到一個NPE,當你嘗試調用toString()對返回的null值。你需要檢查你是否回來了一些東西,並設置一個默認值,如果它是null

+0

謝謝你的答案,但我的問題是:1)如果有一個默認值2)在我的onresume中,我將它們設置爲measurementTypeSpinner.setSelection(typePos);或者這並不重要,因爲我們正在專門討論onCreate? – user2405469 2014-09-05 06:17:54

+0

這很重要,因爲'onResume'在'value'視圖中設置了文本,該視圖觸發了對'onCreate'中'value'放置的'TextWatcher'的調用。 NPE來自'TextWatcher'回調代碼,而不是'onCreate'。但你可能不想在'onResume'中設置默認選項;只需在'onCreate'上做,而這個特定的NPE應該消失。 – 2014-09-05 06:29:08

+0

謝謝!我從中學到了很多東西......我已經將它們設置爲我的共享首選項中的任何內容,如果他們沒有任何內容,那麼它們就是默認值,感覺我的程序作品的範圍/深度發生了變化(在一個好的方式)更多的用戶驅動,而不是我設置默認的東西在我的心血來潮。 – user2405469 2014-09-05 06:35:44

相關問題