Android: невозможно возобновить активность из-за исключения NullPointerException
Вот мой onCreate()
метод:
@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"));
Это на самом деле строки 241 и 242, прежде чем предполагается, что я не инициализировал EditText
, Но я думал, что попытка получить строку из настроек возвращает ноль... потому что она не может быть сохранена.
1 ответ
Из документов дляgetSelectedItem
:
Возвращает Данные, соответствующие текущему выбранному элементу, или ноль, если ничего не выбрано.
Я предполагаю, что у вашего счетчика ничего не выбрано, поэтому вы получаете NPE, когда пытаетесь позвонить toString()
на возвращенный null
значение. Вы должны проверить, что вы получили что-то обратно и установить значение по умолчанию, если это null
,