it-swarm.com.ru

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

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

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

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


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

733
nhaarman

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

Эта проблема

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

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

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

Android Studio

Finding the stack trace in Android Studio

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

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

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

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

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

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

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

678
nhaarman

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

adb logcat > logcat.txt

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

103
Vlad Bezden

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

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

35
Hiren Vaghela

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

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

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

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

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

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

26
Rahil Ali

Примечание: Этот ответ использует Android Студия 2.2.2

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


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

image

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

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

image

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

image

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

image

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

image

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

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

throw new RuntimeException();

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


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

Java.lang.NullPointerException

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

mTextView.setText(myString);

Итак, теперь я хочу отлаживать. Согласно этот вопрос StackOverflow , исключение NullPointerException говорит, что что-то является 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:

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


24
Ab_

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

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

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

18
Ani

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

16
Manoj ahirwar

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

  1. adb logcat

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

  3. Eclipse logcat (если в Eclipse не отображается, перейдите в Windows-> Показать представление-> Прочее-> Android-> LogCat)

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

enter image description here

  1. Android Studio

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

13
ShivBuyya

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

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

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

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

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

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

adb logcat> logcat.txt

11
alireza amini

В приведенном ниже методе 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();
}
10
Mayank Nema

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

ДОКУМЕНТЫ

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

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

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

Захват

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

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

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

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

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

8
Biswajit Karmakar

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

7
felislynx.silae

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

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

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

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

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

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

5
naXa

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

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

5
Pelpotronic

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

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

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

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

4
Kopi Bryant

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

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

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

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

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

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

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

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

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

3
Mehul Solanki

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

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

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

1
zapotec