Примечание. Для ответа используется Android Studio 2.2.2.
Примечание 2: я считаю, что ваше устройство успешно подключено.
Первое, что вы делаете, когда происходит сбой вашего приложения, это заглядываете в LogCat, в нижней части Android Studio есть панель инструментов со списком меню:
Нажмите на «Android Monitor» (тот, который я подчеркнул на изображении выше. ^)
Теперь вы получите что-то вроде этого:
Измените " Verbose
" на " Error
" Теперь он будет показывать только зарегистрированные ошибки. Не беспокойтесь обо всех этих ошибках (если вы их получили) сейчас.
Хорошо. Теперь сделайте то, что вы сделали, чтобы разбить ваше приложение. После сбоя приложения перейдите на страницу logcat. Вы должны найти новый журнал сбоев, который имеет много at:x.x.x
: и, Caused by: TrumpIsPresidentException
например. Перейти к этому Caused by:
утверждению в вашем logcat.
Рядом с этим Caused By:
должно быть исключение, которое произошло. В моем случае это a, RuntimeException
а под ним должна быть строка, содержащая синюю ссылку, например:
Если у этогоCaused by:
нет строки с синим текстом где-то под ним, тогда ищите другую, Caused by:
которая делает.
Нажмите на эту синюю ссылку . Это должно привести вас туда, где возникла проблема. В моем случае это было связано с этой строкой:
throw new RuntimeException();
Итак, теперь я знаю, почему он падает. Это потому что я бросаю исключение сам. Это была очевидная ошибка .
Однако, допустим, я получил еще одну ошибку:
java.lang.NullPointerException
Я проверил свой logcat, я нажал на синюю ссылку, которую он дал мне, и это заняло меня здесь:
mTextView.setText(myString);
Итак, теперь я хочу отлаживать. Согласно этому вопросу StackOverflow , NullPointerException говорит, что что-то есть null
.
Итак, давайте выясним, что является нулевым . Есть две возможности. Либо mTextView
ноль, либо myString
ноль. Чтобы выяснить, перед mTextView.setText(mString)
строкой я добавлю эти две строки:
Log.d("AppDebug","mTextView is null: " + String.valueOf(mTextView == null);
Log.d("AppDebug","myString is null: " + String.valueOf(myString== null);
Теперь, как мы делали ранее (мы изменили Verose на Error), мы хотим изменить «Error» на «Debug». Так как мы регистрируемся путем отладки. Вот все методы Log:
Log.
d means Debug
e means error
w means warning
v means verbose
i means information
wtf means "What a terrible failure". This is similar to Log.e
Итак, так как мы использовали Log.d
, мы проверяем в Debug. Вот почему мы изменили его на отладку.
Уведомление Log.d
имеет первый параметр, в нашем случае «AppDebug». Нажмите на раскрывающееся меню «Нет фильтров» в правом верхнем углу logcat. Выберите «Редактировать конфигурацию фильтра», дайте имя вашему фильтру и в «Log Tag» вставьте «App Debug». Нажмите «ОК». Теперь вы должны увидеть две строки в logcat:
yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false
Итак, теперь мы знаем, что mTextView является нулевым.
Я наблюдаю мой код, теперь я что-то замечаю.
я имею private TextView mTextView
объявил на вершине своего класса. Но я не определяю это.
В основном я забыл сделать это в моем onCreate ():
mTextView = (TextView) findViewById(R.id.textview_id_in_xml);
Так вот почему mTextView
это ноль, потому что я забыл сказать своему приложению, что это такое. Поэтому я добавляю эту строку, запускаю свое приложение, и теперь оно не падает.