К сожалению, MyApp остановился. Как я могу это решить?
Я разрабатываю приложение, и каждый раз, когда я его запускаю, я получаю сообщение:
К сожалению, MyApp остановился.
Что я могу сделать, чтобы решить эту проблему?
Об этом вопросе, явно вдохновленном Что такое трассировка стека, и как я могу использовать его для отладки ошибок моего приложения?, есть много вопросов, в которых говорится, что их приложение разбилось, без каких-либо дополнительных подробностей. Этот вопрос направлен на то, чтобы проинструктировать начинающих Android-программистов о том, как сами исправить свои проблемы или задать правильные вопросы.
Ответы
Ответ 1
В этом ответе описывается процесс извлечения трассировки стека. Уже есть трассировка стека? Прочитайте трассировки стека в разделе " Что такое трассировка стека и как я могу использовать его для отладки ошибок моего приложения? "
Проблема
Ваше приложение RuntimeException
потому что было RuntimeException
.
Наиболее распространенным из них является NullPointerException
.
Как его решить?
Каждый раз, когда приложение Android вылетает (или любое приложение Java, если на то пошло), Stack trace
записывается на консоль (в данном случае logcat). Эта трассировка стека содержит важную информацию для решения вашей проблемы.
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 есть панель инструментов со списком меню:
Нажмите "Монитор Android" (тот, который я подчеркнул на изображении выше. ^)
Теперь вы получите что-то вроде этого:
Измените " Verbose
" на " Error
". Теперь он будет показывать только зарегистрированные ошибки. Не беспокойтесь обо всех этих ошибках (если вы их получили).
ОК. Теперь сделайте то, что вы сделали, чтобы разрушить ваше приложение. После сбоя приложения перейдите в свой логарифм. Вы должны найти новый журнал сбоев, в котором есть много at:xxx
: и Caused by: TrumpIsPresidentException
например. Перейдите в инструкцию Caused by:
в вашем logcat.
Рядом с тем, что Caused By:
должно произойти Исключение. В моем случае это RuntimeException
и под ним должна быть строка, содержащая синюю ссылку, такую как:
Если это 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
Вы можете использовать любой из этих инструментов:
-
adb logcat
-
adb logcat> logs.txt (вы можете использовать редакторы для открытия и поиска ошибок).
-
eclipse logcat (Если не видно в eclipse, перейдите к Windows-> Показать View-> Другие → Android-> LogCat)
- Android Debug Monitor или Android Device Monitor (введите командный монитор или откройте интерфейс)
- 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");
Распространенная ошибка при сбое приложения, например:
- Ошибка кодирования (неправильное использование ключевых слов).
- Несоответствие имени свойства.
- Неподдерживаемый плагин (возможно).
- Несоответствие версии (возможно).
- Отсутствует активность в файле AndroidManifest.
- В файле AndroidManifest отсутствует разрешение.
- Наиболее распространенное исключение NullPointerException.
- Объявлен, но не определен.
Чтобы устранить ошибку сбоя приложения:
- Имейте в виду вышеупомянутые пункты и проходите это.
- С ошибкой вы получите имя файла также синим цветом (нажмите на них и перейдите к коду из-за ошибки).
Ответ 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
Воссоздать аварию.
Попробуйте воссоздать проблему того, как или когда это произошло.
- Что ты недавно изменил?
- Если вы изменили что-то связанное с кодом, попробуйте комментировать код, пока не достигнете точки, в которой он больше не падает.
- Попытайтесь выяснить, ГДЕ именно в вашей программе происходит сбой
Если у вас раньше было рабочее решение, сравните то, что у вас было, с тем, что у вас есть сейчас.
ИСПОЛЬЗУЙТЕ РАЗРЫВЫ !!! : https://developer.android.com/studio/debug. Пройдите через ваш проект, попробуйте посмотреть, каковы значения переменных и почему это может привести к сбою.
Сделайте ваш код читабельным и понятным для всех остальных. Прочитайте свой собственный код еще раз и попытайтесь понять, имеет ли он для вас смысл, объясните это себе. Если в вашем коде есть что-то, чего вы не понимаете или не уверены в этом, посмотрите на это еще раз, попробуйте написать это более четко:
- используя ясные, понятные имена переменных
- разбить код на методы или функции
- используя комментарии, чтобы объяснить что-то непонятное или простое для понимания
И, наконец, попытайтесь исследовать и узнать больше о конкретной части кода, которую вы не понимаете или в которой не уверены.
Ответ 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
Не забудьте добавить свое имя всей активности в файл манифеста...
и снова запустите проект.
Надеюсь, это может вам помочь.