К сожалению, MyApp остановился. Как я могу это решить?
Я разрабатываю приложение и каждый раз, когда запускаю его, получаю сообщение:
К сожалению, MyApp остановился.
Что я могу сделать, чтобы решить эту проблему?
Об этом вопросе - очевидно, вдохновленном тем, что такое трассировка стека и как я могу использовать ее для отладки ошибок моего приложения? , есть много вопросов о том, что их приложение отказало, без каких-либо дополнительных подробностей. Этот вопрос направлен на то, чтобы научить начинающих программистов Android, как попытаться решить свои проблемы самостоятельно или задать правильные вопросы.
Ответы
Этот ответ описывает процесс получения трассировки стека. У вас уже есть трассировка стека? Прочтите о трассировке стека в разделе « Что такое трассировка стека и как я могу использовать ее для отладки ошибок моего приложения? »
Проблема
Ваше приложение завершилось, потому что было выбрано неперехваченное RuntimeException
.
Наиболее распространенным из них является расширение NullPointerException
.
Как это решить?
Каждый раз, когда происходит сбой приложения Android (или любого приложения Java, если на то пошло), Stack trace
в консоль записывается a (в данном случае logcat). Эта трассировка стека содержит важную информацию для решения вашей проблемы.
Android Studio
В нижней панели окна нажмите Logcat
кнопку. Или вы можете нажать alt+ 6. Убедитесь, что ваш эмулятор или устройство выбраны на Devices
панели. Затем попробуйте найти трассировку стека, которая показана красным. В logcat может быть записано много данных, поэтому вам может потребоваться немного прокрутить. Самый простой способ найти трассировку стека - очистить logcat (используя корзину справа) и позволить приложению снова аварийно завершить работу.
Я нашел трассировку стека, что теперь?
Ура! Вы на полпути к решению своей проблемы.
Вам нужно только выяснить, что именно привело к сбою вашего приложения, проанализировав трассировку стека.
Прочтите о трассировке стека в разделе « Что такое трассировка стека и как я могу использовать ее для отладки ошибок моего приложения? »
Я все еще не могу решить свою проблему!
Если вы нашли свой Exception
и строку, где это произошло, и до сих пор не можете понять, как это исправить, не стесняйтесь задавать вопрос на StackOverflow.
Постарайтесь быть как можно более кратким: опубликуйте трассировку стека и соответствующий код (например, несколько строк до строки, в которой был добавлен Exception
).
Вы можете использовать инструмент ADB Google, чтобы Logcat file
проанализировать этот вопрос.
adb logcat > logcat.txt
откройте logcat.txt
файл и найдите свое приложение. Должна быть информация о том, почему это не удалось, номер строки, имя класса и т. Д.
Сначала вы проверяете, в какой точке произошел сбой вашего приложения ( Unfortunately, MyApp has stopped.
). Для этого вы можете использовать Log.e("TAG", "Message");
эту строку, чтобы увидеть журнал своего приложения в logcat.
После этого вы обнаружите, в какой момент ваше приложение остановилось, и это очень легко решить на вашей стороне.
Просто проверьте ошибку в журнале cat.
Вы получаете опцию log cat в eclipse:
окно-> показать вид-> другие-> Android-> Logcat
Журнал cat содержит ошибку.
В противном случае вы также можете проверить ошибку, запустив приложение в режиме отладки. Сначала установите точку останова после этого, выполнив:
щелкните правой кнопкой мыши проект-> отладить как-> приложение Android
Примечание. В этом ответе используется Android Studio 2.2.2.
Примечание 2: я считаю, что ваше устройство успешно подключено.
Первое, что вы делаете, когда ваше приложение вылетает, - это заглядывайте в LogCat, внизу Android Studio есть панель инструментов со списком меню:
Нажмите на «Android Monitor» (тот, который я подчеркнул на изображении выше. ^)
Теперь вы получите что-то вроде этого:
Измените " Verbose
" на " Error
" Теперь он будет показывать только зарегистрированные ошибки. Не беспокойтесь обо всех этих ошибках (если они у вас есть).
ОК. Теперь сделайте то, что вы сделали, чтобы ваше приложение вылетело из строя. После того, как ваше приложение выйдет из строя, перейдите в свой logcat. Вы должны найти новый журнал сбоев, в котором много at:x.x.x
: и, Caused by: TrumpIsPresidentException
например. Перейдите к этому Caused by:
утверждению в своем журнале.
Рядом с этим Caused By:
должно быть исключение, которое произошло. В моем случае это значок, RuntimeException
а под ним должна быть строка, содержащая синюю ссылку, например:
ЕслиCaused by:
где-то под ним НЕТ строки с синим текстом, поищите другую, Caused by:
которая есть.
Щелкните по этой синей ссылке . Он должен привести вас туда, где возникла проблема. В моем случае это произошло из-за этой строки:
throw new RuntimeException();
Итак, теперь я знаю, почему он рушится. Это потому, что я сам выбрасываю исключение. Это была очевидная ошибка .
Однако, допустим, у меня есть еще одна ошибка:
java.lang.NullPointerException
Я проверил свой логарифм, щелкнул синюю ссылку, которую он мне дал, и он привел меня сюда:
mTextView.setText(myString);
Итак, теперь я хочу отладить. Согласно этому вопросу StackOverflow , исключение NullPointerException говорит, что что-то есть null
.
Итак, давайте выясним, что такое null . Есть две возможности. Либо mTextView
имеет значение NULL, либо myString
равно NULL. Чтобы узнать, перед 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.
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. Выберите «Изменить конфигурацию фильтра», дайте имя вашему фильтру и в «Тег журнала» поместите «Отладка приложения». Щелкните "ОК". Теперь вы должны увидеть две строки в logcat:
yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false
Итак, теперь мы знаем, что mTextView имеет значение null.
Наблюдаю за своим кодом, теперь кое-что замечаю.
Я private TextView mTextView
объявлен лучшим в своем классе. Но я не определяю это.
В основном я забыл сделать это в моем onCreate ():
mTextView = (TextView) findViewById(R.id.textview_id_in_xml);
Вот почему mTextView
это null, потому что я забыл сообщить своему приложению, что это такое. Я добавляю эту строку, запускаю свое приложение, и теперь приложение не вылетает.
Это всплывающее окно отображается только тогда, когда в коде возникает фатальное исключение, которое останавливает выполнение приложения. Это могло быть любое исключение NullPointerException
и OutOfMemoryException
т. Д.
Лучший способ проверить - через Logcat, если вы все еще разрабатываете приложение в студии Android, что является быстрым способом чтения трассировки стека и проверки причины приложения.
Если ваше приложение уже запущено , вы не можете использовать logcat . Итак, для этого вы можете реализовать, Crashlytics
чтобы предоставлять вам отчеты об ошибках для любого возникшего исключения.
Проверьте свое Logcat
сообщение и просмотрите свой Manifest
файл. Должно быть чего-то не хватает, например, определения Activity,
прав пользователя и т. Д.
Вы можете использовать любой из этих инструментов:
adb logcat
adb logcat> logs.txt (вы можете использовать редакторы для открытия и поиска ошибок.)
eclipse logcat (если не отображается в eclipse, перейдите в Windows-> Show View-> Others-> Android-> LogCat)
Android Debug Monitor или Android Device Monitor (введите command monitor или откройте через пользовательский интерфейс)
- Android Studio
Предлагаю использовать Android Debug Monitor , это хорошо. Потому что eclipse зависает, когда логов слишком много, а через фильтр adb logcat и все такое сложно.
Вы должны проверить Stack trace
Как это сделать?
в вашей IDE Проверьте форму Windows LOGCAT
Если вы не видите окна logcat, перейдите по этому пути и откройте его
window->show view->others->Android->Logcat
если вы используете Google-Api, перейдите по этому пути
adb logcat> logcat.txt
В приведенном ниже методе showToast () вы должны передать другой параметр для контекста или контекста приложения, сделав так, чтобы вы могли его попробовать.
public void showToast(String error, Context applicationContext){
LayoutInflater inflater = getLayoutInflater();
View view = inflater.inflate(R.layout.custom_toast, (ViewGroup)
findViewById(R.id.toast_root));
TextView text = (TextView) findViewById(R.id.toast_error);
text.setText(error);
Toast toast = new Toast(applicationContext);
toast.setGravity(Gravity.TOP | Gravity.FILL_HORIZONTAL, 0, 0);
toast.setDuration(Toast.LENGTH_SHORT);
toast.setView(view);
toast.show();
}
Позвольте мне поделиться базовым анализом Logcat, когда вы встречаете принудительное закрытие (когда приложение перестает работать).
ДОКУМЕНТЫ
Базовым инструментом Android для сбора / анализа журналов является logcat.
ЗДЕСЬ находится страница Android о logcat
Если вы используете Android Studio, вы также можете проверить эту ССЫЛКУ .
Захват
По сути, вы можете ВРУЧНУЮ захватить logcat с помощью следующей команды (или просто проверить окно AndroidMonitor в AndroidStudio):
adb logcat
Вы можете добавить к команде множество параметров, которые помогут вам фильтровать и отображать нужное сообщение ... Это личное ... Я всегда использую команду ниже, чтобы получить временную метку сообщения:
adb logcat -v time
Вы можете перенаправить вывод в файл и проанализировать его в текстовом редакторе.
Анализируя
Если ваше приложение вылетает, вы получите что-то вроде:
07-09 08:29:13.474 21144-21144/com.example.khan.abc D/AndroidRuntime: Shutting down VM
07-09 08:29:13.475 21144-21144/com.example.khan.abc E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.khan.abc, PID: 21144
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference
at com.example.khan.abc.AudioFragment$1.onClick(AudioFragment.java:125)
at android.view.View.performClick(View.java:4848)
at android.view.View$PerformClick.run(View.java:20262)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5631)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
07-09 08:29:15.195 21144-21144/com.example.khan.abc I/Process: Sending signal. PID: 21144 SIG: 9
Эта часть журнала содержит много информации:
- Когда возникла проблема:
07-09 08:29:13.475
Важно проверить, когда возникла проблема ... Вы можете найти несколько ошибок в журнале ... вы должны быть уверены, что проверяете правильные сообщения :)
- В каком приложении произошел сбой:
com.example.khan.abc
Таким образом, вы узнаете, в каком приложении произошел сбой (чтобы убедиться, что вы проверяете журналы своего сообщения)
- Какая ОШИБКА:
java.lang.NullPointerException
Ошибка исключения указателя NULL
- Подробная информация об ошибке:
Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference
Попытка вызова метода onBackPressed()
из FragmentActivity
объекта. Однако этот объект был null
тогда, когда вы это сделали.
Stack Trace: Stack Trace показывает порядок вызова метода ... Иногда ошибка возникает в вызывающем методе (а не в вызываемом методе).
в com.example.khan.abc.AudioFragment $ 1.onClick (AudioFragment.java:125)
Ошибка произошла в файле com.example.khan.abc.AudioFragment.java
, внутри onClick()
метода в строке: 125
(stacktrace показывает строку, в которой произошла ошибка)
Его назвали:
at android.view.View.performClick(View.java:4848)
Который был вызван:
at android.view.View$PerformClick.run(View.java:20262)
который был вызван:
at android.os.Handler.handleCallback(Handler.java:815)
так далее....
Обзор
Это был просто обзор ... Не все журналы просты, но ошибка указывает на конкретную проблему, а подробное описание всех проблем ... Это просто для того, чтобы поделиться идеей и предоставить вам информацию начального уровня ...
Я надеюсь, что смогу вам чем-нибудь помочь ... С уважением
Используйте LogCat и попытайтесь найти причину сбоя приложения.
Чтобы увидеть Logcat, если вы используете Android Studio, нажмите ALT + 6 или
если вы используете Eclipse, тогда Window -> Open Perspective -> Other - LogCat
Перейдите в LogCat, в раскрывающемся меню выберите ошибку. Он будет содержать всю необходимую информацию, которая поможет вам отладить. Если это не поможет, опубликуйте LogCat в качестве редактирования вашего вопроса, и кто-нибудь вам поможет.
Если ваше приложение по какой-то причине вылетает без хорошей трассировки стека. Попробуйте отладить его с первой строки и идти строка за строкой до сбоя. Тогда вы получите ответ, какая линия вызывает у вас проблемы. Возможно, вы могли бы затем обернуть его в блок try catch и распечатать вывод ошибки.
Вы также можете получить это сообщение об ошибке самостоятельно, без какой-либо трассировки стека или других сообщений об ошибке.
В этом случае вам необходимо убедиться, что ваш манифест Android настроен правильно (включая любое слияние манифестов, происходящее из библиотеки, и любое действие, которое может исходить из библиотеки), и обратить особое внимание на первое действие, отображаемое в вашем приложении в файлах манифеста. .
Сбой во время разработки
Попробуйте мой любимый инструмент logview, чтобы получать журналы и анализировать их во время разработки.
Обязательно пометьте ./logview
и ./lib/logview.jar
как исполняемый при работе в Linux.
Если вам это не нравится, есть много альтернативных настольных программ просмотра журналов для Android .
Крушение в дикой природе
Интегрируйте инструмент отчетов о сбоях в реальном времени, такой как Firebase Crashlytics , чтобы получать трассировки необработанных исключений, которые произошли на устройствах пользователей.
Прочтите, как выпустить приложение с ошибками (и жить, чтобы рассказать историю), чтобы узнать больше об обработке ошибок в полевых условиях.
Люди совершают ошибки, и кодируют тоже.
Когда что-либо error
происходит, всегда проверяйте logcat с текстом красного цвета, однако вы можете узнать реальную проблему в тексте синего цвета с подчеркиванием в этом тексте красного цвета.
Убедитесь, что если вы создаете новый activity
, всегда объявляйте activity
в AndroidManifest
файле.
Если вы добавляете Разрешение, также укажите его в AndroidMainifest
файле.
Logcat - для проверки журналов на этапе разработки Android Studio.
Сначала очистите Logcat и позвольте приложению снова выйти из строя, чтобы вы могли получить только подробные сведения о сбое в журнале. Вы должны проверить трассировку стека
Пока, к сожалению, MyApp остановился. Для этого есть много причин. Вы можете проверить то же самое в журналах. Для этого вы можете использовать Log.e («ТЕГ», «Сообщение»);
Распространенная ошибка при сбое приложения, например:
- Ошибка кодирования (неправильное использование ключевых слов).
- Несовпадение имени свойства.
- Неподдерживаемый плагин (возможно).
- Несовпадение версии (возможно).
- В файле AndroidManifest отсутствует активность.
- В файле AndroidManifest отсутствует разрешение.
- Наиболее распространенное исключение NullPointerException.
- Заявлено, но не определено.
Чтобы устранить ошибку сбоя приложения:
- Помните о вышеуказанных пунктах и пройдите через них.
- С ошибкой вы получите имя файла также синим цветом (нажмите на них и перейдите к коду, если происходит ошибка).
Во-первых, вам нужно проверить, где и почему произошло сбой вашего приложения. (Unfortunately, MyApp has stopped.).
С помощью LOG
, вы можете выяснить, что пошло не так.
После этого вы обнаружите, в какой момент ваше приложение перестало исправлять это с вашей точки.
Если у вас нет какого-либо интересного журнала в вашем терминале (или они не имеют прямого отношения к вашему приложению), возможно, ваша проблема связана с собственной библиотекой. В этом случае вы должны проверить наличие файлов-захоронений в вашем терминале.
Местоположение по умолчанию для файлов захоронений зависит от каждого устройства, но в этом случае у вас будет журнал, в котором будет указано: Tombstone written to: /data/tombstones/tombstone_06
Для получения дополнительной информации посетите https://source.android.com/devices/tech/debug .
Также запуск этой команды в терминале может помочь найти проблему:
gradlew build > log.txt 2>details.txt
тогда вы должны перейти к расположению файла gradlew в двух вышеуказанных файлах журнала.