На жаль, MyApp зупинився. Як я можу це вирішити?


785

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

На жаль, MyApp зупинився.

Що я можу зробити, щоб вирішити це?


З цього питання - очевидно, натхненний Що таке слід стека, і як я можу використовувати його для налагодження помилок у програмі? , є багато запитань, які стверджують, що їх додаток завершився без будь-яких додаткових деталей. Це питання спрямоване на те, щоб навчити початківців програмістів Android щодо того, як спробувати самостійно виправити свої проблеми або задати правильні питання.


22
Я бачив багато питань, що закриваються, як це справляється з цим. Це хороша довідка для того, щоб допомогти людям розміщувати відповідні дані у своїх запитаннях. Однак це не дублікат будь-якої кореневої проблеми там, а лише методологія викопання кореневої проблеми. Я думаю, що було б краще просто надати посилання на це питання як орієнтир, а не закрити як дублікат.
laalto

33
Я думаю, що функція закриття ідеально підходить для цього. Більшість із цих запитань показують незначні знання основних навичок налагодження. Переведення їх у режим очікування надає їм можливість з'ясувати свою проблему, використовуючи метод, зазначений у відповіді. А ще краще - вони зможуть вирішити проблему самостійно. Ця дискусія, можливо, краще підходить для meta.stackoverflow.com.
nhaarman

Це питання занадто розпливчасте. Кращим питанням буде "використання [myIDE] як я налагоджувати" додаток для Android, яке відображає помилку "На жаль, MyApp зупинився"
Кріс Халкроу

7
@ChrisHalcrow Це питання взагалі не стосується налагодження. Йдеться про керівництво початківців в Android, як боротися зі збоями в додатках.
nhaarman

stackoverflow.com/questions/26609734 / ... .. включити multidex becoz помилки в зверненому до APK
RejoylinLokeshwaran

Відповіді:


717

Ця відповідь описує процес пошуку сліду стека. Вже є слід стека? Прочитайте сліди стека у розділі " Що таке слід стека та як я можу використовувати його для налагодження помилок у програмі? "

Проблема

Ваша заявка вийшла з-за того, що RuntimeExceptionбуло кинуто ненависне .
Найпоширенішим з них є NullPointerException.

Як це вирішити?

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

Android Studio

Пошук сліду стека в Android Studio

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

Я знайшов слід стека, що тепер?

Так! Ви на півдорозі до вирішення своєї проблеми.
Потрібно лише з’ясувати, що саме призвело до збою вашої програми, проаналізувавши трасування стека.

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

Я досі не можу вирішити свою проблему!

Якщо ви знайшли свій Exceptionі рядок там, де він відбувся, і все ще не можете зрозуміти, як його виправити, не соромтеся задати питання на StackOverflow.

Намагайтеся бути максимально стислими: розмістіть слід стека та відповідний код (наприклад, кілька рядків до рядка, який викинув Exception).


33
Я знаю, що ця публікація стара: але якщо ви використовуєте IntelliJ IDEA, ви можете зайти всередину Android > Devices|Logcatі додати новий фільтр ( i.imgur.com/145dtkx.png ), і відфільтрувати його by Log Messageсюди ви можете поставити FATAL EXCEPTION( i.imgur.com/HpELhaU .png ), тому в цьому вікні ви можете прочитати всі, Exceptionsякі викинули вашою заявкою. З цим вам не потрібно очищати logcat і робити збої знову. Я думаю, що в Android Studio теж є такий варіант.
Marco Acierno

1
Фільтрацію logcat в Eclipse можна здійснити, ввівши ім'я пакета java у полі імені програми фільтра.
Стефан

Я думаю, що головний сенс - розуміння того, як повертається слід, коли трапляється виняток. ФК трохи погані, коли немає сліду назад або не є корисним, саме там він стає волохатим. але я думаю, що це пояснення є приємним першим вступом у пошуку / виявленні таких помилок.
DooMMasteR

4
Все легко, коли у вашому logcat є якийсь слід помилки, але що у випадку, якщо logcat не має нічого? stackoverflow.com/questions/32455645 / ...
Маріан Paździoch

4
Проблема полягає в тому, що рядок не містить помилки, яка записується і вказується слідом стека.
Хілал

115

Ви можете використовувати інструмент ADB Google, щоб Logcat fileпроаналізувати це питання.

adb logcat > logcat.txt

відкрити logcat.txtфайл та шукати ім’я програми. Повинна бути інформація про те, чому вона вийшла з ладу, номер рядка, назва класу тощо.


Це чудово, це швидко покаже вам все, що відбувається на пристрої, навіть якщо ваш налагоджувач не зможе його зрозуміти, що може статися з Xamarin, якщо час виконання не вдасться завантажити.
jvenema

1
Я не міг зрозуміти, чому мій додаток аварійно перебуває в логкатах андроїд-студії, помилок взагалі не було. Ця відповідь дала мені те, що мені потрібно. Пізніше, проте я зрозумів, що у мене був якийсь фільтр у студії logcat, який заважав мені бачити помилку. Я перейшов на "Показати лише вибрану програму", і я створив резервну копію та працював.
Яник

ви повинні додати -d, інакше ви навіюєте ctrl-C для виходу з logcat. Яadb logcat -v time -d > filename.txt
Каракурі

37

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

Після цього ви дізнаєтесь, на якій точці ваша програма зупинилася, і вирішити її дуже легко.


28

Просто перевірте помилку в журналі cat.

Ви отримуєте варіант журналу кота з затемнення:

window-> show view-> other-> Android-> Logcat

Журнал журналу містить помилку.

Інші розумні ви також можете перевірити помилку, виконавши програму в режимі налагодження. Спочатку встановіть точку перерви після цього, зробивши:

клацніть правою кнопкою миші на проект-> налагодження як-> додаток Android


27

Примітка. У цій відповіді використовується Android Studio 2.2.2

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


Перше, що ви робите, коли ваш додаток виходить з ладу, це заглянути в LogCat, внизу Android Studio є панель інструментів зі списком меню:

зображення

Клацніть на "Монітор Android" (той, який я підкреслив на зображенні вище. ^)

Тепер ви отримаєте щось подібне:

зображення

Змініть " Verbose" на " Error" Тепер він показуватиме лише помилки, за якими ви увійшли. Не хвилюйтесь про всі ці помилки (якщо ви їх отримали) зараз.

зображення

Добре. Тепер зробіть те, що ви зробили, щоб зламати додаток. Після завершення роботи програми перейдіть до своєї логічної коди. Ви повинні знайти новий журнал аварій, у якому багато at:x.x.x: і, Caused by: TrumpIsPresidentExceptionнаприклад. Перейдіть до цього Caused by:твердження у своїй логічній коді

зображення

Поруч із цим Caused By:має бути виняток, що стався. У моєму випадку це a, RuntimeExceptionі під ним має бути рядок, що містить синє посилання, наприклад:

зображення

Якщо в цьомуCaused by: НЕ є рядок із синім текстом десь під ним, тоді шукайте інший, Caused by:який має.

Натисніть на синє посилання . Це повинно перевезти вас до місця виникнення проблеми. У моєму випадку це було пов’язано з цим рядком:

throw new RuntimeException();

Отож, тепер я знаю, чому це врізається. Це тому, що я сам кидаю виняток. Це була очевидна помилка .


Однак, скажімо, я отримав ще одну помилку:

java.lang.NullPointerException

Я перевірив свою логіт, я натиснув на синє посилання, яке воно мені дало, і воно взяло мене тут:

mTextView.setText(myString);

Отже, зараз я хочу налагодити. Відповідно до цього питання StackOverflow , 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);

Тепер, як і раніше (ми змінили Верозу на помилку), ми хочемо змінити "Помилка" на "Налагодження". Оскільки ми ведемо реєстрацію за допомогою налагодження. Ось усі методи Журналу:

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, ми перевіряємо в Налагодження. Тому ми змінили його на налагодження.

Повідомлення Log.dмає перший параметр, у нашому випадку - "AppDebug". Клацніть спадне меню "Без фільтрів" у верхньому правому куті логката. Виберіть "Змінити конфігурацію фільтра", вкажіть ім'я фільтру та в "Журнал журналу" поставте "Налагодження додатка". Натисніть "ОК". Тепер у логкатах вам слід побачити два рядки:

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це недійсно, тому що я забув сказати моєму додатку, що це таке. Тож я додаю цей рядок, запускаю додаток, і тепер додаток не виходить з ладу.



1
Це хороша інформація, але використання зображень Track Track зменшує його корисність - зображення не можна шукати, не можна копіювати та вставляти, не можуть бути зібрані читачами екрану і важче читати. (Я, до речі, не заявив, що лише вказав на це).
EJoshuaS

1
@EJoshuaS Я не сказав, щоб надати зображення, тхо.
Ab

19

Це спливаюче вікно відображається лише тоді, коли ви отримаєте фатальний виняток у своєму коді, який зупиняє виконання програми. Це може бути будь-який виняток NullPointerException, і OutOfMemoryExceptionт.д.

Найкращий спосіб перевірити це через Logcat, якщо ви все ще розробляєте додаток в студії Android, це швидкий спосіб прочитати слід стека та перевірити причину програми.

Якщо ваш додаток уже активний, ви не можете використовувати logcat . Тож для цього ви можете реалізовувати, Crashlyticsщоб надати вам звіти про помилки про будь-який виняток.


17

Перевірте своє Logcatповідомлення і перегляньте свій Manifestфайл. Потрібно щось бракувати, як визначення Activity,дозволу користувача` тощо.


14

Ви можете використовувати будь-який із цих інструментів:

  1. adb logcat

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

  3. ecclipse logcat (Якщо його не видно у затемненні, перейдіть до Windows-> Показати перегляд-> Інші-> Android-> LogCat)

  4. Монітор налагодження Android або монітор пристрою Android (введіть командний монітор або відкрийте через інтерфейс користувача)

введіть тут опис зображення

  1. Android Studio

Я пропоную використовувати монітор налагодження Android , це добре. Тому що затемнення зависає, коли там занадто багато журналів, і через фільтр adb logcat і все важко.


12

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

9

Дозвольте мені поділитися основним аналізом Logcat, коли ви зустрічаєтесь із Force Close (коли програма перестає працювати).

DOCS

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

ТУТ - сторінка Android про logcat

Якщо ви використовуєте android Studio, ви також можете перевірити цю ПОСИЛУ .

Захоплення

В основному, ви можете ВІДКРИТТЕ захопити логіт за допомогою наступної команди (або просто перевірити вікно 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

Важливо перевірити, коли виникла проблема ... Ви можете виявити кілька помилок у журналі ... Ви повинні бути впевнені, що ви перевіряєте відповідні повідомлення :)

  • Який додаток вийшов з ладу: 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тоді, коли ти це робив.

  • Трасування стека: Трасування стека показує вам порядок виклику методу ... Іноді помилка трапляється в методі виклику (а не в методі, що викликається).

    на 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)

тощо.

Огляд

Це був лише огляд ... Не всі журнали є простими тощо. Це просто поділитися ідеєю та надати вам інформацію про початковий рівень ...

Я сподіваюся, що я можу вам дещо допомогти ... З повагою


8

Використовуйте LogCat і спробуйте знайти те, що спричиняє збій програми.

Щоб побачити Logcat, якщо ви використовуєте Android Studio, тоді натисніть ALT + 6 або

якщо ви використовуєте Eclipse, тоді Window -> Open Perspective -> Other - LogCat

Перейдіть до LogCat, у спадному меню виберіть помилку. Це буде містити всю необхідну інформацію, яка допоможе вам налагодити. Якщо це не допомагає, опублікуйте LogCat як редагування свого питання, і хтось допоможе вам.


7

Якщо ваша програма з якихось причин виходить з ладу без хорошого стеження. Спробуйте налагодити його з першого рядка та йдіть по черзі до виходу з ладу. Тоді ви отримаєте відповідь, який рядок викликає у вас неприємності. Цілком ймовірно, ви зможете потім зафіксувати його у блоці спробу вилову та помилки друку.


5

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

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


3
Мені буде цікаво, якщо ви можете завантажити проект, який демонструє це явище.
CommonsWare

5

Збій під час розвитку

Спробуйте мій улюблений інструмент перегляду інструментів, щоб отримати журнали та проаналізувати їх під час розробки. Під час роботи в Linux
обов'язково позначте ./logviewта ./lib/logview.jarвиконуваний файл.

Якщо вам це не подобається, існує багато альтернативних переглядачів журналів на робочому столі для Android .

Збій у дикій природі

Інтегруйте інструмент звітності про аварії в режимі реального часу, такий як Firebase Crashlytics , щоб отримати стеження від необроблених винятків, що сталися на пристроях користувачів.

Прочитайте, як випустити програму Buggy (і Live to Tell the Tale), щоб дізнатися більше про поводження з помилками в цьому полі.


4

Люди роблять помилки, і так кодують також.

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

Переконайтесь, що якщо ви створюєте нове activity, завжди оголошуйте його activityу AndroidManifestфайлі.

Якщо ви додаєте дозвіл, оголосьте про це і у AndroidMainifestфайлі.


4

Logcat - для перевірки журналів на етапі розробки Android Studio

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

Хоча, на жаль, MyApp зупинився. Причин для цього багато. Ви можете перевірити те саме в журналах. Для цього можна використовувати Log.e ("TAG", "Повідомлення");

Поширена помилка під час аварії програми, наприклад:

  1. Помилка кодування (неправильне використання ключових слів).
  2. Ім'я властивості невідповідності
  3. Непідтримуваний плагін (можливо).
  4. Версія невідповідності (можливо).
  5. У файлі AndroidManifest відсутня активність.
  6. У файлі AndroidManifest відсутнє дозвіл.
  7. Найпоширеніші NullPointerException.
  8. Задекларовано, але не визначено.

Щоб вирішити помилку збою програми:

  • Майте на увазі наведені вище пункти і пройдіть їх.
  • З помилкою ви отримаєте ім'я файлу також у синьому кольорі (натисніть на них та перейдіть до коду від помилки, що виникає).

3

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

Після цього ви дізнаєтесь, у якому пункті ваша програма перестала виправляти це з вашої точки зору.


3

Якщо у вашому терміналі немає будь-якого цікавого журналу (або вони не пов’язані безпосередньо з вашим додатком), можливо, ваша проблема пов’язана з рідною бібліотекою. У такому випадку слід перевірити наявність файлів «надгробний камінь» у своєму терміналі.

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

Для отримання додаткової інформації зверніться до https://source.android.com/devices/tech/debug .


0

Також виконання цієї команди в терміналі може допомогти знайти проблему:

gradlew build > log.txt 2>details.txt

то вам слід перейти до розташування файлу gradlew у прочитаних двох вище файлах журналу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.