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

687

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

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

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


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

  • 20
    Я видел, как многие вопросы закрывались как дураки с этим. Это хороший справочник, помогающий людям размещать соответствующие данные в своих вопросах. Тем не менее, это не дубликат какой-либо корневой проблемы, а просто методология выявления корневой проблемы. Я думаю, что было бы лучше просто дать ссылку на этот вопрос в качестве ссылки, а не закрыть как дубликат.
  • 30
    Я думаю, что функция закрытия идеально подходит для этого. Большинство из этих вопросов показывают мало знаний об основных навыках отладки. Задержка их дает им возможность прояснить свою проблему, используя метод, указанный в ответе. А еще лучше, что они могут решить проблему самостоятельно. Это обсуждение может быть лучше подходит для meta.stackoverflow.com, хотя.
Показать ещё 3 комментария
Теги:
kotlin
debugging
crash

20 ответов

603
Лучший ответ

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

Проблема

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

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

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

Android Studio

Изображение 1402

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

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

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

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

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

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

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

  • 28
    Я знаю, что этот пост старый: но если вы используете 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 в поле имени приложения фильтра.
Показать ещё 4 комментария
95

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

adb logcat > logcat.txt

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

  • 0
    Это здорово, он быстро покажет вам все, что происходит на устройстве, даже если ваш отладчик не сможет его перехватить, что может случиться с Xamarin, если среда выполнения не загружается.
  • 1
    Я не мог понять, почему мое приложение зависало в Android Studio LogCat, ошибок не было вообще. Этот ответ дал мне то, что мне было нужно. Позже, однако, я понял, что у меня есть какой-то фильтр в logcat студии, который мешал мне увидеть ошибку. Я переключился обратно на «Показывать только выбранное приложение», и я снова заработал.
Показать ещё 1 комментарий
30

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

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

21

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

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

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

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

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

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

19

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

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


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

Изображение 1403

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

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

Изображение 1404

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

Изображение 1405

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

Изображение 1406

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

Изображение 1407

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

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

throw new RuntimeException();

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


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

java.lang.NullPointerException

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

mTextView.setText(myString);

Итак, теперь я хочу отлаживать. В соответствии с https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it, 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, потому что я забыл сообщить своему приложению, что это такое. Поэтому я добавляю эту строку, запускаю свое приложение, и теперь приложение не сбой.


  • 0
    Какое условие вызывает TrumpIsPresidentException :)?
  • 3
    @VivekMishra Когда стена построена
Показать ещё 2 комментария
12

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

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

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

10

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

9

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

  1. adb logcat

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

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

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

Изображение 1408

  1. Android Studio

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

7

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

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

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

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

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

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

adb logcat > logcat.txt

6

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

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

и т.д....

обзор

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

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

5

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

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

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

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

3

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

2

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

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

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

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

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

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

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

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

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

0

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

0

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

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

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

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

-2

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

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

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

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

-3

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

:) GlbMP

-5

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню