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

787

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

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

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


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

nhaarman
источник
22
Я видел много вопросов, закрывающихся как обманщики с этим. Это хороший справочник, помогающий людям размещать соответствующие данные в своих вопросах. Тем не менее, это не дубликат какой-либо корневой проблемы, а просто методология выявления корневой проблемы. Я думаю, что было бы лучше просто дать ссылку на этот вопрос в качестве ссылки, а не закрыть как дубликат.
Лаальто
33
Я думаю, что функция закрытия идеально подходит для этого. Большинство из этих вопросов показывают мало знаний об основных навыках отладки. Задержка их дает им возможность прояснить свою проблему, используя метод, указанный в ответе. А еще лучше, что они могут решить проблему самостоятельно. Это обсуждение может быть лучше подходит для meta.stackoverflow.com, хотя.
nhaarman
Этот вопрос слишком расплывчатый. Лучшим вопросом было бы «использование [myIDE] как отладить» приложение Android, которое отображает ошибку «К сожалению, MyApp остановился»
Крис Хэлкроу,
7
@ChrisHalcrow Этот Q / A не об отладке вообще. Речь идет о том, как руководить новичками в Android, как справляться со сбоями приложений.
nhaarman
stackoverflow.com/questions/26609734/… .. включить multidex becoz error при конвертации в apk
RejoylinLokeshwaran

Ответы:

719

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

Проблема

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

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

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

Android Studio

Поиск трассировки стека в Android Studio

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

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

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

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

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

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

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

nhaarman
источник
33
Я знаю, что этот пост старый: но если вы используете IntelliJ IDEA, вы можете зайти внутрь Android > Devices|Logcatи добавить новый фильтр ( i.imgur.com/145dtkx.png ) и отфильтровать его, чтобы добавить by Log Messageсюда FATAL EXCEPTION( i.imgur.com/HpELhaU). .png ) так что в этом поле вы можете прочитать все, Exceptionsчто выбрасывает ваше приложение. При этом вам не нужно очищать logcat и снова делать сбой. Я думаю, что Android Studio также имеет эту опцию.
Марко Асьерно
1
Фильтрация logcat в Eclipse может быть выполнена путем ввода имени пакета java в поле имени приложения фильтра.
Стефан
Я думаю, что главное заключается в понимании следа, который можно получить, когда происходит исключение. ФК немного плохи, когда нет никаких следов назад или нет пригодного для использования, где это становится волосатым. но я думаю, что это объяснение - хорошее первое введение в обнаружение / выявление таких ошибок.
DooMMasteR
4
Все просто, когда у вашего logcat есть след ошибки, но что в случае, если у logcat ничего нет? stackoverflow.com/questions/32455645/…
Мариан Падзиох
4
Проблема в том, что строка не содержит ошибку, которая записывается и указывается трассировкой стека.
Хилал
117

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

adb logcat > logcat.txt

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

Влад Безден
источник
Это здорово, он быстро покажет вам все, что происходит на устройстве, даже если ваш отладчик не сможет его перехватить, что может случиться с Xamarin, если среда выполнения не загружается.
Jvenema
1
Я не мог понять, почему мое приложение зависало в Android Studio LogCat, ошибок не было вообще. Этот ответ дал мне то, что мне было нужно. Позже, однако, я понял, что у меня есть какой-то фильтр в logcat студии, который мешал мне увидеть ошибку. Я переключился обратно на «Показывать только выбранное приложение», и я снова начал работать.
Янник
Вы должны добавить -d, в противном случае вы не нажмете ctrl-C для выхода из logcat. Я делаюadb logcat -v time -d > filename.txt
Каракури
37

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

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

Хирен Вагела
источник
28

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

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

Окно-> Показать представление-> Другие-> Android-> Logcat

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

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

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

Рахиль Али
источник
27

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


Ab
источник
1
Это хорошая информация, но использование изображений Stack Trace снижает ее полезность - изображения не могут быть найдены, их нельзя скопировать и вставить, они не могут быть прочитаны программами чтения с экрана, и их труднее читать. (Кстати, я не отрицал, просто указал на это).
EJoshuaS - Восстановить Монику
1
@EJoshuaS Я не сказал, чтобы предоставить изображения, хотя.
Ab
19

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

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

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

Ани
источник
17

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

Манодж ахирвар
источник
14

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

  1. adb logcat

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

  3. Eclipse LogCat (если не видно в Eclipse, перейдите в Windows-> Показать представление-> Другие-> Android-> LogCat)

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

введите описание изображения здесь

  1. Android Studio

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

Шив Буя
источник
12

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

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

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

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

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

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

adb logcat> logcat.txt

Алиреза Амини
источник
10

В приведенном ниже методе 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();
}
Маянк Нема
источник
9

Позвольте мне поделиться базовым анализом Logcat, когда вы встречаетесь с Force Close (когда приложение перестает работать).

DOCS

Основным инструментом Android для сбора / анализа логов является logcat.

ЗДЕСЬ есть страница Android о logcat

Если вы используете Android Studio, вы также можете проверить эту ССЫЛКУ .

Capturing

По сути, вы можете вручную захватить logcat с помощью следующей команды (или просто проверить окно AndroidMonitor в AndroidStudio):

adb logcat

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

adb logcat -v time

Вы можете перенаправить вывод в файл и проанализировать его в текстовом редакторе.

Анализ

Если ваше приложение Crashing, вы получите что-то вроде:

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(трассировка стека показывает строку, в которой произошла ошибка)

Он был вызван:

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)

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

обзор

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

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

W0rmH0le
источник
8

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

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

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

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

Бисваджит Кармакар
источник
7

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

felislynx.silae
источник
5

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

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

Pelpotronic
источник
3
Мне было бы интересно, если бы вы могли загрузить проект, который демонстрирует это явление.
CommonsWare
5

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

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

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

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

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

Прочтите « Как выпустить приложение с ошибками» (и «Живи, чтобы рассказать сказку»), чтобы узнать больше об обработке ошибок в поле.

naXa
источник
4

Люди делают ошибки, а значит и кодируют.

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

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

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

Копи Брайант
источник
4

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

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

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

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

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

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

  • Имейте в виду вышеупомянутые пункты и проходите это.
  • С ошибкой вы получите имя файла также синим цветом (нажмите на них и перейдите к коду из-за ошибки).
Ashish
источник
3

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

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

Мехул Соланки
источник
3

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

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

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

сапотеко
источник
0

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

gradlew build > log.txt 2>details.txt

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

Мохсен Эмами
источник