Как я могу использовать переменные «printf» в Android для проверки моего кода?

#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