К сожалению, MyApp остановился. Как я могу решить это?
Я разрабатываю приложение, и каждый раз, когда я запускаю его, я получаю сообщение:
К сожалению, MyApp остановился.
Что я могу сделать, чтобы решить это?
Об этом вопросе - очевидно, вдохновленном тем, что такое трассировка стека, и как я могу использовать ее для отладки ошибок моего приложения? Есть много вопросов о том, что их приложение не работает, без каких-либо дополнительных подробностей. Этот вопрос направлен на то, чтобы научить начинающих Android-программистов, как самим пытаться решить свои проблемы, или задать правильные вопросы.
25 ответов
Этот ответ описывает процесс получения трассировки стека. Уже есть трассировка стека? Прочтите о трассировке стека в разделе " Что такое трассировка стека и как я могу использовать ее для отладки ошибок моего приложения? "
Эта проблема
Ваше приложение закрыто, потому что не получено RuntimeException
был брошен.
Наиболее распространенным из них является NullPointerException
,
Как это решить?
Каждый раз, когда происходит сбой приложения Android (или любого другого приложения Java), Stack trace
записывается на консоль (в данном случае logcat). Эта трассировка стека содержит важную информацию для решения вашей проблемы.
Android Studio
В нижней панели окна нажмите на Logcat
кнопка. Кроме того, вы можете нажать Alt + 6. Убедитесь, что ваш эмулятор или устройство выбрано в Devices
панель. Далее попробуйте найти трассировку стека, которая показана красным. В logcat может быть много материала, поэтому вам может понадобиться немного прокрутить. Простой способ найти трассировку стека - очистить logcat (с помощью корзины справа) и снова вызвать сбой приложения.
Я нашел трассировку стека, что теперь?
Ура! Вы на полпути к решению вашей проблемы.
Вам нужно только выяснить, что именно привело к сбою приложения, проанализировав трассировку стека.
Прочтите о трассировке стека в разделе " Что такое трассировка стека и как я могу использовать ее для отладки ошибок моего приложения? "
Я до сих пор не могу решить мою проблему!
Если вы нашли свой Exception
и линия, где это произошло, и до сих пор не может понять, как это исправить, не стесняйтесь задавать вопрос о Stackru.
Постарайтесь быть как можно более кратким: опубликовать трассировку стека и соответствующий код (например, несколько строк до строки, которая бросила Exception
).
Вы можете использовать инструмент Google ADB, чтобы получить Logcat file
проанализировать проблему.
adb logcat > logcat.txt
открыть logcat.txt
файл и поиск по имени вашего приложения. Должна быть информация о том, почему произошел сбой, номер строки, имя класса и т. Д.
Сначала вы проверяете, в какой точке вашего приложения произошел сбой (Unfortunately, MyApp has stopped.
). Для этого вы можете использовать Log.e("TAG","Message");
С помощью этой строки вы можете увидеть, как вы входите в систему в logcat.
После этого вы обнаружите, на каком этапе ваше приложение остановилось, и его очень легко решить на вашей стороне.
Просто проверьте ошибку в журнале кота.
В eclipse вы получаете опцию log cat:
Окно-> Показать представление-> Другие->Android->Logcat
Журнал cat содержит ошибку.
В противном случае вы также можете проверить ошибку, запустив приложение в режиме отладки. Сначала установите точку останова после этого, выполнив:
щелкните правой кнопкой мыши на проект-> отладка как-> приложение для Android
Примечание. Для ответа используется Android Studio 2.2.2.
Примечание 2: я считаю, что ваше устройство успешно подключено.
Первое, что вы делаете в случае сбоя приложения - заглядываете в LogCat, в нижней части Android Studio есть панель инструментов со списком меню:
Нажмите на "Android Monitor" (тот, который я подчеркнул на изображении выше. ^)
Теперь вы получите что-то вроде этого:
Изменить "Verbose
"до"Error
"Теперь он будет показывать только зарегистрированные ошибки. Не беспокойтесь обо всех этих ошибках (если вы их получили) сейчас.
Хорошо. Теперь сделайте то, что вы сделали, чтобы разбить ваше приложение. После сбоя приложения перейдите на страницу logcat. Вы должны найти новый журнал сбоев, который имеет много at:x.x.x
: а также Caused by: TrumpIsPresidentException
например. Перейти к этому Caused by:
Заявление в вашем logcat.
Рядом с этим Caused By:
Должно быть исключение, которое произошло. В моем случае это RuntimeException
и под ним должна быть строка, которая содержит синюю ссылку, такую как:
Если этоCaused by:
У вас нет строки с синим текстом где-то под ней, а затем найдите другую Caused by:
это делает.
Нажмите на эту синюю ссылку. Это должно привести вас туда, где возникла проблема. В моем случае это было связано с этой строкой:
throw new RuntimeException();
Итак, теперь я знаю, почему он падает. Это потому что я бросаю исключение сам. Это была очевидная ошибка.
Однако, допустим, я получил еще одну ошибку:
java.lang.NullPointerException
Я проверил свой logcat, я нажал на синюю ссылку, которую он дал мне, и это заняло меня здесь:
mTextView.setText(myString);
Итак, теперь я хочу отлаживать. Согласно этому вопросу Stackru, исключение NullPointerException говорит, что что-то null
,
Итак, давайте выясним, что является нулевым. Есть две возможности. Или mTextView
является нулем, или myString
нулевой. Чтобы узнать, прежде чем 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
является нулевым, потому что я забыл сказать своему приложению, что это такое. Поэтому я добавляю эту строку, запускаю свое приложение, и теперь оно не падает.
Это всплывающее окно отображается только в том случае, если в вашем коде появляется фатальное исключение, которое останавливает выполнение приложения. Это может быть любое исключение NullPointerException, OutOfMemoryException и т. Д.
Лучший способ проверить это с помощью Logcat, если вы все еще разрабатываете приложение для Android-студии, что является быстрым способом прочитать трассировку стека и проверить причину приложения.
Если ваше приложение уже запущено, вы не можете использовать logcat. Таким образом, для этого вы можете внедрить Crashlytics, чтобы предоставить вам отчеты об ошибках любого возникающего исключения.
Проверьте свои Logcat
сообщение и увидеть ваш Manifest
файл. Там должно быть что-то не хватает, как определение Activity,
Разрешение пользователя` и др.
Вы можете использовать любой из этих инструментов:
adb logcat
adb logcat> logs.txt (вы можете использовать редакторы для открытия и поиска ошибок.)
Eclipse LogCat (если не видно в Eclipse, перейдите в Windows-> Показать представление-> Другие-> Android-> LogCat)
- Android Debug Monitor или Android Device Monitor (введите команду 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
Позвольте мне поделиться базовым анализом Logcat, когда вы встречаете Force Close (когда приложение перестает работать).
DOCS
Основным инструментом Android для сбора / анализа логов является logcat.
ЗДЕСЬ есть страница Android о logcat
Если вы используете Android Studio, вы также можете проверить эту ССЫЛКУ.
Захватив
По сути, вы можете вручную захватить 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
(трассировка стека показывает строку, в которой произошла ошибка)
Он был вызван:
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)
так далее....
обзор
Это был просто обзор... Не все журналы просты и т. Д... Это просто для того, чтобы поделиться идеей и предоставить вам информацию начального уровня...
Я надеюсь, что смогу вам как-нибудь помочь... С уважением
В приведенном ниже методе 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 и попытайтесь найти причину сбоя приложения.
Чтобы увидеть Logcat, если вы используете Android Studio, нажмите ALT + 6 или
если вы используете Eclipse, то Window -> Open Perspective -> Other - LogCat
Зайдите в LogCat, из выпадающего меню выберите ошибку. Он будет содержать всю необходимую информацию, чтобы помочь вам отладки. Если это не поможет, опубликуйте LogCat в качестве редактирования вашего вопроса, и кто-то вам поможет.
Если ваше приложение по какой-то причине вылетает без хорошей трассировки стека. Попробуйте отладить его с первой строки и переходите от строки к строке, пока не произойдет сбой. Тогда у вас будет ответ, какая линия доставляет вам неприятности. Вероятно, вы могли бы затем обернуть его в блок try catch и напечатать вывод ошибок.
Вы также можете получить это сообщение об ошибке самостоятельно, без какой-либо трассировки стека или каких-либо дальнейших сообщений об ошибках.
В этом случае вам необходимо убедиться, что ваш манифест Android настроен правильно (включая любое слияние манифеста, происходящее из библиотеки, и любое действие, которое будет происходить из библиотеки), и обратите особое внимание на первое действие, отображаемое в вашем приложении в файлах манифеста.,
Logcat - проверить журналы на этапе разработки Android Studio
Сначала очистите Logcat и дайте приложению снова аварийно завершить работу, чтобы вы могли получить только подробности разбившегося журнала. Вы должны проверить трассировку стека
Пока, к сожалению, MyApp остановился. Есть много причин для этого. Вы можете проверить то же самое в журналах. Для этого вы можете использовать Log.e("TAG","Message");
Распространенная ошибка при сбое приложения, например:
- Ошибка кодирования (неправильное использование ключевых слов).
- Несоответствие имени свойства.
- Неподдерживаемый плагин (возможно).
- Несоответствие версии (возможно).
- Отсутствует активность в файле AndroidManifest.
- В файле AndroidManifest отсутствует разрешение.
- Наиболее распространенное исключение NullPointerException.
- Объявлен, но не определен.
Чтобы устранить ошибку сбоя приложения:
- Имейте в виду вышеупомянутые пункты и проходите это.
- С ошибкой вы получите имя файла также синим цветом (нажмите на них и перейдите к коду из-за ошибки).
Люди делают ошибки, а значит и кодируют.
Когда нибудь error
случалось, всегда проверяйте logcat с текстом в красном цвете, однако вы можете обнаружить реальную проблему в тексте синего цвета с подчеркиванием в этом тексте красного цвета.
Убедитесь, что вы создаете новый activity
Всегда объявляйте activity
в AndroidManifest
файл.
Если добавляется разрешение, объявите его в AndroidMainifest
файл также.
Сбой во время разработки
Попробуйте logview-0.20, чтобы получить логи и проанализировать их во время разработки.
Обязательно отметьте ./logview
а также ./lib/logview.jar
как исполняемый при работе в Linux.
Если вам это не нравится, есть много альтернативных программ просмотра журналов рабочего стола для Android.
Крушение в дикой природе
Интегрируйте инструмент для создания отчетов о сбоях в режиме реального времени, такой как Firebase Crashlytics, чтобы получить стеки трасс необработанных исключений, которые произошли на устройствах пользователей.
Прочтите " Как выпустить приложение с ошибками" (и "Живи, чтобы рассказать сказку"), чтобы узнать больше об обработке ошибок в поле.
Если у вас нет каких-либо интересных журналов в вашем терминале (или они не имеют прямого отношения к вашему приложению), возможно, ваша проблема связана с собственной библиотекой. В этом случае вам следует проверить наличие файлов "захоронения" в вашем терминале.
Расположение по умолчанию для надгробных файлов зависит от каждого устройства, но если это так, у вас будет журнал, сообщающий: Tombstone written to: /data/tombstones/tombstone_06
Для получения дополнительной информации, посетите https://source.android.com/devices/tech/debug.
Во-первых, вам нужно проверить, где и почему произошло сбой вашего приложения. (Unfortunately, MyApp has stopped.).
С помощью LOG
Вы можете понять, что пошло не так.
После этого вы обнаружите, в какой точке ваше приложение перестало это исправлять.
Я предлагаю что-то вроде следующего
1.Проверьте, достаточно ли на вашем телефоне места, чтобы приложение могло запускаться ---- Prior/2. проверьте logcat, когда приложение выйдет из строя, оно покажет точную строку, в которой произошел сбой 3.Проверьте, используете ли вы что-то в основном потоке, который использует много память из-за ANR это происходит.
Также запуск этой команды в терминале может помочь найти проблему:
gradlew build > log.txt 2>details.txt
тогда вы должны перейти к расположению файла gradlew в двух вышеуказанных файлах журнала.
Проверьте свое сообщение Logcat . Кроме того, см. файл манифеста на предмет отсутствующих элементов, таких как определениеActivity
,User permission
, и т. д.
Чтобы увидеть Logcat, если вы используете Android Studio, нажмите alt + 6 или
если вы используете Eclipse , то Window -> Open Perspective -> Other — LogCat
Теперь из выпадающего меню выберите error.
Кроме того , вы можете использоватьинструмент ADB , чтобы получитьLogcat file
для анализа вопроса.
adb logcat > logcat.txt
Теперь откройтеlogcat.txt
файл и найдите имя вашего приложения. Должна быть информация о том, почему это не удалось, номер строки, имя класса и т. д.
Проверьте ваш Android Studio LogCat на наличие ошибок, скопируйте эти ошибки и выполните поиск в Google или в режиме stackru.
Если ваше приложение вылетело без ошибок , и вы не использовали диспетчер ресурсов, а загрузили текстуры, например:
Texture texture = new Texture("myImage.png");
тогда вот в чем проблема. Это случилось со мной. Вы всегда должны использовать менеджер активов, чтобы избежать перегрузки памяти.
Вы должны проверить Logcat и наблюдателя, почему происходит сбой приложения. Потому что может быть много причин для сбоя приложения.
:) GlbMP