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

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

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

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


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

Ответы

Ответ 1

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

Проблема

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

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

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

Android Studio

Finding the stack trace in Android Studio

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

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

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

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

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

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

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

Ответ 2

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

adb logcat > logcat.txt

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

Ответ 3

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

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

Ответ 4

Просто проверьте ошибку в log cat.

Вы получаете параметр log cat из eclipse:

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

Лог cat содержит ошибку.

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

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

Ответ 5

Примечание. В этом ответе используется Android Studio 2.2.2

Примечание 2: Я считаю, что ваше устройство успешно подключено.


Первое, что вы делаете при сбое приложения, - это посмотреть в LogCat, внизу Android Studio есть панель инструментов со списком меню:

image

Нажмите "Монитор Android" (тот, который я подчеркнул на изображении выше. ^)

Теперь вы получите что-то вроде этого:

image

Измените " Verbose " на " Error ". Теперь он будет показывать только зарегистрированные ошибки. Не беспокойтесь обо всех этих ошибках (если вы их получили).

image

ОК. Теперь сделайте то, что вы сделали, чтобы разрушить ваше приложение. После сбоя приложения перейдите в свой логарифм. Вы должны найти новый журнал сбоев, в котором есть много at:xxx: и Caused by: TrumpIsPresidentException например. Перейдите в инструкцию Caused by: в вашем logcat.

image

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

image

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

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

throw new RuntimeException();

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


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

java.lang.NullPointerException

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

mTextView.setText(myString);

Итак, теперь я хочу отлаживать. В соответствии с fooobar.com/questions/48/..., 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 to 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:

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


Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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

  1. adb logcat

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

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

  4. Android Debug Monitor или Android Device Monitor (введите командный монитор или откройте интерфейс)

enter image description here

  1. Android Studio

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

Ответ 9

Вы должны проверить 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();
}

Ответ 11

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

DOCS

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

Здесь есть страница Android о logcat

Если вы используете android Studio, вы также можете проверить этот LINK.

Захватив

В принципе, вы можете MANUALLY захватить 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: 07-09 08:29:13.475

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

  • Какое приложение разбилось: com.example.khan.abc

Таким образом, вы знаете, какое приложение разбилось (чтобы быть уверенным, что вы проверяете журналы о своем сообщении)

  • Какой ERROR: java.lang.NullPointerException

Ошибка исключения NULL указателя

  • Подробная информация об ошибке: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference

Вы пытались вызвать метод onBackPressed() из объекта FragmentActivity. Однако, когда вы это сделали, этот объект был null.

  • Трассировка стека: Трассировка стека показывает вам порядок вызова метода... Иногда ошибка возникает в вызывающем методе (а не в вызываемом методе).

    at com.example.khan.abc.AudioFragment $ 1.onClick(AudioFragment.java:125)

Ошибка произошла в файле com.example.khan.abc.AudioFragment.java, внутри метода 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)

и т.д....

обзор

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

Надеюсь, я смогу помочь вам... С уважением

Ответ 12

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

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

если вы используете Eclipse, тогда Окно → Открытая перспектива → Другое - LogCat

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

Ответ 13

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

Ответ 14

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

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

Ответ 15

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

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

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

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

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

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

Ответ 16

Люди ошибаются, и поэтому кодируют.

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

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

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

Ответ 17

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

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

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

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

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

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

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

Ответ 18

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

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

Ответ 19

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

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

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

Ответ 20

Проверьте свой ловушка Android-студии на наличие ошибок, скопируйте эти ошибки и выполните поиск в google или stackoverflow.

Ответ 21

Воссоздать аварию.

Попробуйте воссоздать проблему того, как или когда это произошло.

  1. Что ты недавно изменил?
  2. Если вы изменили что-то связанное с кодом, попробуйте комментировать код, пока не достигнете точки, в которой он больше не падает.
  3. Попытайтесь выяснить, ГДЕ именно в вашей программе происходит сбой

Если у вас раньше было рабочее решение, сравните то, что у вас было, с тем, что у вас есть сейчас.

ИСПОЛЬЗУЙТЕ РАЗРЫВЫ !!! : https://developer.android.com/studio/debug. Пройдите через ваш проект, попробуйте посмотреть, каковы значения переменных и почему это может привести к сбою.

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

  1. используя ясные, понятные имена переменных
  2. разбить код на методы или функции
  3. используя комментарии, чтобы объяснить что-то непонятное или простое для понимания

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

Ответ 22

Альтернативное решение для обращения с повреждением приложения.

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

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

Шаги для отслеживания исключений в приложении: -

1. Откройте Logcat и просмотрите Исключение.

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

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

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

2. Попробуйте обработать исключение, которое показано в логарифме, а также проверить другой случай, который может вызвать исключение.

3. Добавьте в приложение приложение обработчик исключений нечистоты, чтобы остановить все остальные исключения.

I). Создайте класс MyExceptionHandler, который реализуетThread.UncaughtExceptionHandler

public class MyExceptionHandler implements
    Thread.UncaughtExceptionHandler {
private final Context myContext;
private final Class<?> myActivityClass;

public MyExceptionHandler(Context context, Class<?> c) {

    myContext = context;
    myActivityClass = c;
}

public void uncaughtException(Thread thread, Throwable exception) {
    StringWriter stackTrace = new StringWriter();
    exception.printStackTrace(new PrintWriter(stackTrace));
    System.err.println(stackTrace);
    // You can use LogCat too
    Intent intent = new Intent(myContext, myActivityClass);
    intent.putExtra("uncaughtException", "Exception : " + stackTrace.toString());
    intent.putExtra("stacktrace", s);
    myContext.startActivity(intent);
    //for restarting the Activity
    Process.killProcess(Process.myPid());
    System.exit(0);
}

}

II). Исключение Handle в любом классе или активности или фрагменте.

//We need to Caught the Unwanted exception whihc is not handled by Android:
  Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler(this, SplashScreen.class));

Он снова перезапустит ту же активность, если приложение потерпит крах.

Ответ 23

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

:) GlbMP

Ответ 24

Не забудьте добавить свое имя всей активности в файл манифеста... и снова запустите проект.

Надеюсь, это может вам помочь.