#android #nullpointerexception
#Android #исключение nullpointerexception
Вопрос:
У меня проблема, которую я пытаюсь решить, я пытался извлечь свои данные из intent, используя mRowId ниже, после чего мне постоянно возвращалось исключение NullPointerException из fetchDrug() в LogCat.
Выполняя некоторые действия по устранению неполадок с помощью debugging, я понял, что моя переменная mRowId не равна Null и указывает на что-то, но я не знаю, на что она указывает.
Как я могу проверить , на что указывает моя переменная mRowId? Или обычно такие переменные представляют собой непонятную тарабарщину?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.drug_info);
//Defining the views
mDrugText = (TextView) findViewById(R.id.drug);
mContentText = (TextView) findViewById(R.id.content);
Bundle extras = getIntent().getExtras();
mRowId = extras.getLong(DrugsDbAdapter.KEY_ROWID);
if(mRowId == null) {
Log.e("mRowId is null", "ok");
} else {
Cursor drug = mDbHelper.fetchDrug(mRowId);
//Managing Cursor to pluck values to display
startManagingCursor(drug);
mDrugText.setText(drug.getString(drug.getColumnIndexOrThrow(DrugsDbAdapter.KEY_DRUG)));
mContentText.setText(drug.getString(drug.getColumnIndexOrThrow(DrugsDbAdapter.KEY_CONTENT)));
}
}
Ответ №1:
Вместо printf используйте существующую функциональность журнала в SDK.
Вывод появится в окне logcat Eclipse (вероятно, лучший вариант, поскольку он работает в режиме реального времени и вы можете фильтровать отображение), или вы можете извлечь журналы с устройства / эмулятора вручную.
Например:
Log.i ( "MyApp", "Drug = " drug.getString ( drug.getColumnIndexOrThrow ( DrugsDbAdapter.KEY_DRUG ) ) );
Комментарии:
1. Спасибо RivieraKid , в книгах этому не учат! теперь я знаю!
Ответ №2:
Используйте функцию отладки eclipse и проходите через код шаг за шагом. Он выдает значения всех переменных.
Ответ №3:
Часто объекты будут иметь метод «toString()» для представления объекта в удобочитаемой форме; вы могли бы передать это в вызов Log.e(). В вашем случае это скорее числовое значение (long), чем объект, поэтому вы можете напрямую отобразить его в своем журнале.
Как только вы узнаете идентификатор строки, который пытаетесь извлечь, вы можете убедиться, что он действителен, изучив свою базу данных (используя команду sqlite3, встроенную в эмулятор, или извлекая файл на свой компьютер разработки и используя любой из множества инструментов sqlite).
Если идентификатор строки действителен, я бы посоветовал заглянуть в ваш вспомогательный код базы данных, чтобы увидеть, как его использует метод fetchDrug (). Возможно, нулевой указатель не имеет ничего общего с параметром, но с другими элементами в этом методе.
Ответ №4:
Вот несколько вариантов, которые следует рассмотреть:
Вариант 1: Установите точку останова в onCreate в Eclipse. Вы можете найти более подробную информацию об отладке приложений Android в Eclipse здесь: http://developer.android.com/guide/developing/debugging/debugging-projects.html
Вариант 2: Добавьте инструкции Log в свой код и просмотрите выходные данные в logcat. Вы можете прочитать больше о входе в Android здесь: http://developer.android.com/reference/android/util/Log.html