2014-09-05 44 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

相关问题