Я разрабатываю приложение, и каждый раз, когда я его запускаю, я получаю сообщение:
К сожалению, MyApp остановился.
Что я могу сделать, чтобы решить эту проблему?
Об этом вопросе, явно вдохновленном Что такое трассировка стека, и как я могу использовать его для отладки ошибок моего приложения?, есть много вопросов, в которых говорится, что их приложение разбилось, без каких-либо дополнительных подробностей. Этот вопрос направлен на то, чтобы проинструктировать начинающих Android-программистов о том, как сами исправить свои проблемы или задать правильные вопросы.
В этом ответе описывается процесс извлечения трассировки стека. Уже есть трассировка стека? Прочитайте трассировки стека в разделе " Что такое трассировка стека и как я могу использовать его для отладки ошибок моего приложения? "
Ваше приложение RuntimeException
потому что было RuntimeException
.
Наиболее распространенным из них является NullPointerException
.
Каждый раз, когда приложение Android вылетает (или любое приложение Java, если на то пошло), Stack trace
записывается на консоль (в данном случае logcat). Эта трассировка стека содержит важную информацию для решения вашей проблемы.
В нижней строке окна нажмите кнопку " Logcat
. Кроме того, вы можете нажать alt + 6. Убедитесь, что ваш эмулятор или устройство выбрано на панели " Devices
. Затем попробуйте найти трассировку стека, которая показана красным цветом. В logcat может быть много вещей, поэтому вам может потребоваться немного прокрутить список. Легкий способ найти трассировку стека - очистить логарифм (с помощью корзины справа) и снова запустить приложение.
Ура! Вы на полпути к решению своей проблемы.
Вам нужно только выяснить, что именно заставило ваше приложение сбой, проанализировав трассировку стека.
Прочитайте трассировки стека в разделе " Что такое трассировка стека и как я могу использовать его для отладки ошибок моего приложения? "
Если вы нашли свое Exception
и строку, где оно произошло, и по-прежнему не можете понять, как его исправить, не стесняйтесь задавать вопрос о StackOverflow.
Постарайтесь быть максимально краткими: разместите трассировку стека и соответствующий код (например, несколько строк до строки, которая выбрала Exception
).
Android > Devices|Logcat
и добавить новый фильтр ( i.imgur.com/145dtkx.png ), и отфильтровать его by Log Message
здесь, вы можете поместить FATAL EXCEPTION
( i.imgur.com/HpELhaU.png ), поэтому в этом окне вы можете прочитать все Exceptions
которые выдает ваше приложение. При этом вам не нужно очищать logcat и снова делать сбой. Я думаю, что Android Studio также имеет эту опцию.
Вы можете использовать инструмент Google ADB, чтобы получить Logcat file
, чтобы проанализировать проблему.
adb logcat > logcat.txt
откройте файл logcat.txt
и найдите свое имя приложения. Должна быть информация о том, почему она не удалась, номер строки, имя класса и т.д.
Сначала вы проверяете, в какой момент ваше приложение разбилось (Unfortunately, MyApp has stopped.
). Для этого вы можете использовать Log.e("TAG","Message");
, используя эту строку, вы можете увидеть, как вы регистрируетесь в журнале logcat.
После этого вы обнаружите, какой момент ваше приложение остановило его очень легко решить на вашей стороне.
Просто проверьте ошибку в log cat.
Вы получаете параметр log cat из eclipse:
window- > show view- > others- > Android- > Logcat
Лог cat содержит ошибку.
В другом случае вы также можете проверить ошибку, выполнив приложение в режиме отладки. Сначала установите точку останова, выполнив:
щелкните правой кнопкой мыши project- > debug as- > приложение Android
Примечание. В этом ответе используется 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);
Итак, теперь я хочу отлаживать. В соответствии с 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, потому что я забыл сообщить своему приложению, что это такое. Поэтому я добавляю эту строку, запускаю свое приложение, и теперь приложение не сбой.
TrumpIsPresidentException
:)?
Это всплывающее окно отображается только в том случае, если в вашем коде появляется фатальное исключение, которое останавливает выполнение приложения. Это может быть любое исключение NullPointerException
, OutOfMemoryException
и т.д.
Лучший способ проверить это с помощью Logcat, если вы все еще разрабатываете приложение для Android Studio, что является быстрым способом чтения трассировки стека и проверки причины приложения.
Если ваше приложение уже запущено, вы не можете использовать logcat. Таким образом, для этого вы можете внедрить Crashlytics
для предоставления вам отчетов об ошибках любого возникающего исключения.
Проверьте сообщение Logcat
и посмотрите файл Manifest
. Там должно быть что-то отсутствует, как определить Activity,
Пользовательское разрешение` и т.д.
Вы можете использовать любой из этих инструментов:
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 и все сложно.
Вы должны проверить Stack trace
Как это сделать?
на вашей IDE Проверьте форму окна LOGCAT
Если вы не видите окна logcat, перейдите к этому пути и откройте его
window->show view->others->Android->Logcat
если вы используете Google-Api, перейдите по этому пути
adb logcat > logcat.txt
В приведенном ниже методе 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, когда вы встречаете 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
Таким образом, вы знаете, какое приложение разбилось (чтобы быть уверенным, что вы проверяете журналы о своем сообщении)
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)
и т.д....
обзор
Это был просто обзор... Не все журналы простые и т.д. Это просто поделиться идеей и предоставить вам информацию начального уровня...
Надеюсь, я смогу помочь вам... С уважением
Используйте LogCat и попытайтесь найти, что вызывает повреждение приложения.
Чтобы увидеть Logcat, если вы используете Android Studio, нажмите ALT + 6 или
если вы используете Eclipse, тогда Окно → Открытая перспектива → Другое - LogCat
Перейдите в LogCat, из выпадающего меню выберите ошибку. Это будет содержать всю необходимую информацию, которая поможет вам отлаживать. Если это не поможет, отправьте LogCat как редактирование на свой вопрос, и кто-то поможет вам.
Если ваше приложение почему-то сбой без хорошего stacktrace. Попробуйте отладить его из первой строки и пройдите линию за строкой до сбоя. Тогда у вас будет ответ, какая линия вызывает у вас проблемы. Возможно, вы могли бы обернуть его в блок catch catch и распечатать вывод ошибки.
Вы также можете получить это сообщение об ошибке самостоятельно, без трассировки стека или какого-либо дополнительного сообщения об ошибке.
В этом случае вам нужно убедиться, что ваш Android-манифест настроен правильно (включая слияние манифеста, происходящего из библиотеки, и любые действия, которые будут поступать из библиотеки), и обратите особое внимание на первое действие, отображаемое в вашем приложении в ваши файлы манифеста.
Попробуйте logview-0.20, чтобы получить журналы и проанализировать их во время разработки.
Обязательно отметьте ./logview
и ./lib/logview.jar
как исполняемый файл при работе в Linux.
Если вам это не нравится, есть множество альтернативных зрителей для журналов для Android.
Интегрируйте инструмент отчетов о сбоях в режиме реального времени, такой как Firebase Crashlytics, чтобы получить стоп-кадры необработанных исключений, которые произошли на устройствах пользователей.
Прочитайте, как освободить багги-приложение (и жить, чтобы рассказать историю), чтобы узнать больше об обработке ошибок в поле.
Проверьте свой ловушка Android-студии на наличие ошибок, скопируйте эти ошибки и выполните поиск в google или stackoverflow.
Люди ошибаются, и поэтому кодируют.
Когда бы ни возникала какая-либо error
, всегда проверяйте лог-код с текстом красного цвета, однако вы можете узнать реальную проблему в тексте синего цвета с подчеркиванием в тексте красного цвета.
Убедитесь, что если вы создаете новое activity
, всегда объявляйте activity
в файле AndroidManifest
.
Если добавить разрешение, объявите его также в файле AndroidMainifest
.
Альтернативное решение для обращения с повреждением приложения.
Мы получаем это сообщение, когда наше приложение принудительно закрывается любыми исключениями, которое не обрабатывается в андроиде или в нашем приложении.
Поэтому нам просто нужно позаботиться об этом, когда мы пишем код, который сэкономит много времени на отслеживание любых типов исключений в 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));
Он снова перезапустит ту же активность, если приложение потерпит крах.
Вам нужно проверить Logcat и observer, почему приложение терпит крах. Потому что может быть много причин для сбой приложения.
:) GlbMP
Не забудьте добавить свое имя всей активности в файл манифеста... и снова запустите проект.
Надеюсь, это может вам помочь.