К сожалению, MyApp остановился. Как я могу это решить?

Apr 29 2014

Я разрабатываю приложение и каждый раз, когда запускаю его, получаю сообщение:

К сожалению, MyApp остановился.

Что я могу сделать, чтобы решить эту проблему?


Об этом вопросе - очевидно, вдохновленном тем, что такое трассировка стека и как я могу использовать ее для отладки ошибок моего приложения? , есть много вопросов о том, что их приложение отказало, без каких-либо дополнительных подробностей. Этот вопрос направлен на то, чтобы научить начинающих программистов Android, как попытаться решить свои проблемы самостоятельно или задать правильные вопросы.

Ответы

734 nhaarman Apr 29 2014 at 06:55

Этот ответ описывает процесс получения трассировки стека. У вас уже есть трассировка стека? Прочтите о трассировке стека в разделе « Что такое трассировка стека и как я могу использовать ее для отладки ошибок моего приложения? »

Проблема

Ваше приложение завершилось, потому что было выбрано неперехваченное RuntimeException.
Наиболее распространенным из них является расширение NullPointerException.

Как это решить?

Каждый раз, когда происходит сбой приложения Android (или любого приложения Java, если на то пошло), Stack traceв консоль записывается a (в данном случае logcat). Эта трассировка стека содержит важную информацию для решения вашей проблемы.

Android Studio

В нижней панели окна нажмите Logcatкнопку. Или вы можете нажать alt+ 6. Убедитесь, что ваш эмулятор или устройство выбраны на Devicesпанели. Затем попробуйте найти трассировку стека, которая показана красным. В logcat может быть записано много данных, поэтому вам может потребоваться немного прокрутить. Самый простой способ найти трассировку стека - очистить logcat (используя корзину справа) и позволить приложению снова аварийно завершить работу.

Я нашел трассировку стека, что теперь?

Ура! Вы на полпути к решению своей проблемы.
Вам нужно только выяснить, что именно привело к сбою вашего приложения, проанализировав трассировку стека.

Прочтите о трассировке стека в разделе « Что такое трассировка стека и как я могу использовать ее для отладки ошибок моего приложения? »

Я все еще не могу решить свою проблему!

Если вы нашли свой Exceptionи строку, где это произошло, и до сих пор не можете понять, как это исправить, не стесняйтесь задавать вопрос на StackOverflow.

Постарайтесь быть как можно более кратким: опубликуйте трассировку стека и соответствующий код (например, несколько строк до строки, в которой был добавлен Exception).

121 VladBezden Mar 23 2015 at 06:06

Вы можете использовать инструмент ADB Google, чтобы Logcat fileпроанализировать этот вопрос.

adb logcat > logcat.txt

откройте logcat.txtфайл и найдите свое приложение. Должна быть информация о том, почему это не удалось, номер строки, имя класса и т. Д.

38 HirenVaghela Mar 18 2015 at 15:01

Сначала вы проверяете, в какой точке произошел сбой вашего приложения ( Unfortunately, MyApp has stopped.). Для этого вы можете использовать Log.e("TAG", "Message");эту строку, чтобы увидеть журнал своего приложения в logcat.

После этого вы обнаружите, в какой момент ваше приложение остановилось, и это очень легко решить на вашей стороне.

29 RahilAli Jun 11 2015 at 17:58

Просто проверьте ошибку в журнале cat.

Вы получаете опцию log cat в eclipse:

окно-> показать вид-> другие-> Android-> Logcat

Журнал cat содержит ошибку.

В противном случае вы также можете проверить ошибку, запустив приложение в режиме отладки. Сначала установите точку останова после этого, выполнив:

щелкните правой кнопкой мыши проект-> отладить как-> приложение Android

28 AliBdeir Nov 06 2016 at 16:23

Примечание. В этом ответе используется 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, потому что я забыл сообщить своему приложению, что это такое. Я добавляю эту строку, запускаю свое приложение, и теперь приложение не вылетает.


20 Ani Jul 04 2017 at 11:38

Это всплывающее окно отображается только тогда, когда в коде возникает фатальное исключение, которое останавливает выполнение приложения. Это могло быть любое исключение NullPointerExceptionи OutOfMemoryExceptionт. Д.

Лучший способ проверить - через Logcat, если вы все еще разрабатываете приложение в студии Android, что является быстрым способом чтения трассировки стека и проверки причины приложения.

Если ваше приложение уже запущено , вы не можете использовать logcat . Итак, для этого вы можете реализовать, Crashlyticsчтобы предоставлять вам отчеты об ошибках для любого возникшего исключения.

18 Manojahirwar Jun 29 2015 at 18:48

Проверьте свое Logcatсообщение и просмотрите свой Manifestфайл. Должно быть чего-то не хватает, например, определения Activity,прав пользователя и т. Д.

15 ShivBuyya Nov 03 2015 at 12:47

Вы можете использовать любой из этих инструментов:

  1. adb logcat

  2. adb logcat> logs.txt (вы можете использовать редакторы для открытия и поиска ошибок.)

  3. eclipse logcat (если не отображается в eclipse, перейдите в Windows-> Show View-> Others-> Android-> LogCat)

  4. Android Debug Monitor или Android Device Monitor (введите command monitor или откройте через пользовательский интерфейс)

  1. Android Studio

Предлагаю использовать Android Debug Monitor , это хорошо. Потому что eclipse зависает, когда логов слишком много, а через фильтр adb logcat и все такое сложно.

13 alirezaamini Jul 13 2015 at 15:37

Вы должны проверить Stack trace

Как это сделать?

в вашей IDE Проверьте форму Windows LOGCAT

Если вы не видите окна logcat, перейдите по этому пути и откройте его

window->show view->others->Android->Logcat

если вы используете Google-Api, перейдите по этому пути

adb logcat> logcat.txt

12 MayankNema Apr 03 2017 at 16:37

В приведенном ниже методе 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();
}
11 W0rmH0le Jul 14 2016 at 10:21

Позвольте мне поделиться базовым анализом 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)

так далее....

Обзор

Это был просто обзор ... Не все журналы просты, но ошибка указывает на конкретную проблему, а подробное описание всех проблем ... Это просто для того, чтобы поделиться идеей и предоставить вам информацию начального уровня ...

Я надеюсь, что смогу вам чем-нибудь помочь ... С уважением

9 BiswajitKarmakar May 15 2016 at 14:45

Используйте LogCat и попытайтесь найти причину сбоя приложения.

Чтобы увидеть Logcat, если вы используете Android Studio, нажмите ALT + 6 или

если вы используете Eclipse, тогда Window -> Open Perspective -> Other - LogCat

Перейдите в LogCat, в раскрывающемся меню выберите ошибку. Он будет содержать всю необходимую информацию, которая поможет вам отладить. Если это не поможет, опубликуйте LogCat в качестве редактирования вашего вопроса, и кто-нибудь вам поможет.

8 felislynx.silae Oct 02 2017 at 22:07

Если ваше приложение по какой-то причине вылетает без хорошей трассировки стека. Попробуйте отладить его с первой строки и идти строка за строкой до сбоя. Тогда вы получите ответ, какая линия вызывает у вас проблемы. Возможно, вы могли бы затем обернуть его в блок try catch и распечатать вывод ошибки.

6 Pelpotronic Mar 22 2015 at 15:50

Вы также можете получить это сообщение об ошибке самостоятельно, без какой-либо трассировки стека или других сообщений об ошибке.

В этом случае вам необходимо убедиться, что ваш манифест Android настроен правильно (включая любое слияние манифестов, происходящее из библиотеки, и любое действие, которое может исходить из библиотеки), и обратить особое внимание на первое действие, отображаемое в вашем приложении в файлах манифеста. .

6 naXa Sep 11 2018 at 15:35

Сбой во время разработки

Попробуйте мой любимый инструмент logview, чтобы получать журналы и анализировать их во время разработки.
Обязательно пометьте ./logviewи ./lib/logview.jarкак исполняемый при работе в Linux.

Если вам это не нравится, есть много альтернативных настольных программ просмотра журналов для Android .

Крушение в дикой природе

Интегрируйте инструмент отчетов о сбоях в реальном времени, такой как Firebase Crashlytics , чтобы получать трассировки необработанных исключений, которые произошли на устройствах пользователей.

Прочтите, как выпустить приложение с ошибками (и жить, чтобы рассказать историю), чтобы узнать больше об обработке ошибок в полевых условиях.

5 KopiBryant May 20 2018 at 00:24

Люди совершают ошибки, и кодируют тоже.

Когда что-либо errorпроисходит, всегда проверяйте logcat с текстом красного цвета, однако вы можете узнать реальную проблему в тексте синего цвета с подчеркиванием в этом тексте красного цвета.

Убедитесь, что если вы создаете новый activity, всегда объявляйте activityв AndroidManifestфайле.

Если вы добавляете Разрешение, также укажите его в AndroidMainifestфайле.

5 Ashish Mar 26 2019 at 11:42

Logcat - для проверки журналов на этапе разработки Android Studio.

Сначала очистите Logcat и позвольте приложению снова выйти из строя, чтобы вы могли получить только подробные сведения о сбое в журнале. Вы должны проверить трассировку стека

Пока, к сожалению, MyApp остановился. Для этого есть много причин. Вы можете проверить то же самое в журналах. Для этого вы можете использовать Log.e («ТЕГ», «Сообщение»);

Распространенная ошибка при сбое приложения, например:

  1. Ошибка кодирования (неправильное использование ключевых слов).
  2. Несовпадение имени свойства.
  3. Неподдерживаемый плагин (возможно).
  4. Несовпадение версии (возможно).
  5. В файле AndroidManifest отсутствует активность.
  6. В файле AndroidManifest отсутствует разрешение.
  7. Наиболее распространенное исключение NullPointerException.
  8. Заявлено, но не определено.

Чтобы устранить ошибку сбоя приложения:

  • Помните о вышеуказанных пунктах и ​​пройдите через них.
  • С ошибкой вы получите имя файла также синим цветом (нажмите на них и перейдите к коду, если происходит ошибка).
4 MehulSolanki May 22 2019 at 17:40

Во-первых, вам нужно проверить, где и почему произошло сбой вашего приложения. (Unfortunately, MyApp has stopped.).С помощью LOG, вы можете выяснить, что пошло не так.

После этого вы обнаружите, в какой момент ваше приложение перестало исправлять это с вашей точки.

4 zapotec Jun 12 2019 at 20:07

Если у вас нет какого-либо интересного журнала в вашем терминале (или они не имеют прямого отношения к вашему приложению), возможно, ваша проблема связана с собственной библиотекой. В этом случае вы должны проверить наличие файлов-захоронений в вашем терминале.

Местоположение по умолчанию для файлов захоронений зависит от каждого устройства, но в этом случае у вас будет журнал, в котором будет указано: Tombstone written to: /data/tombstones/tombstone_06

Для получения дополнительной информации посетите https://source.android.com/devices/tech/debug .

2 MohsenEmami Mar 16 2020 at 17:18

Также запуск этой команды в терминале может помочь найти проблему:

gradlew build > log.txt 2>details.txt

тогда вы должны перейти к расположению файла gradlew в двух вышеуказанных файлах журнала.