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

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

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

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


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

25 ответов

Решение

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

Эта проблема

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

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

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

Android Studio

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

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

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

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

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

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

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

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

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

adb logcat > logcat.txt

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

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

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

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

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

Окно-> Показать представление-> Другие->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: Заявление в вашем logcat.

образ

Рядом с этим Caused By:Должно быть исключение, которое произошло. В моем случае это RuntimeException и под ним должна быть строка, которая содержит синюю ссылку, такую ​​как:

образ

Если этоCaused by: У вас нет строки с синим текстом где-то под ней, а затем найдите другую Caused by: это делает.

Нажмите на эту синюю ссылку. Это должно привести вас туда, где возникла проблема. В моем случае это было связано с этой строкой:

throw new RuntimeException();

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


Однако, допустим, я получил еще одну ошибку:

java.lang.NullPointerException

Я проверил свой logcat, я нажал на синюю ссылку, которую он дал мне, и это заняло меня здесь:

mTextView.setText(myString);

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


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

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

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

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

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

  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 и все сложно.

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

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

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

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

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

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

adb logcat > logcat.txt

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

DOCS

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

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

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

Захватив

По сути, вы можете вручную захватить 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)

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

обзор

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

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

В приведенном ниже методе 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 и попытайтесь найти причину сбоя приложения.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Я предлагаю что-то вроде следующего

1.Проверьте, достаточно ли на вашем телефоне места, чтобы приложение могло запускаться ---- Prior/2. проверьте logcat, когда приложение выйдет из строя, оно покажет точную строку, в которой произошел сбой 3.Проверьте, используете ли вы что-то в основном потоке, который использует много память из-за ANR это происходит.

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

gradlew build > log.txt 2>details.txt

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

Проверьте свое сообщение Logcat . Кроме того, см. файл манифеста на предмет отсутствующих элементов, таких как определениеActivity,User permission, и т. д.

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

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

Теперь из выпадающего меню выберите error.

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

      adb logcat > logcat.txt

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

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

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

      Texture texture = new Texture("myImage.png"); 

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

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

:) GlbMP

Другие вопросы по тегам