Malheureusement MyApp s'est arrêté. Comment je peux résoudre ça?
je développe une application, et chaque fois que je l'exécute, Je reçois le message:
malheureusement, MyApp s'est arrêté.
Que puis-je faire pour résoudre ce problème?
à propos de cette question - évidemment inspiré par Qu'est-ce qu'une trace de pile, et comment puis-je l'utiliser pour déboguer mes erreurs d'application? , il y a beaucoup de questions disant que leur application s'est effondrée, sans plus de détails. Cette question vise à enseigner aux programmeurs Android novices sur la façon d'essayer de résoudre leurs problèmes eux-mêmes, ou de poser les bonnes questions.
16 réponses
cette réponse décrit le processus de récupération de la trace de la pile. Déjà la trace de la pile? Qu'est-ce qu'une trace de pile, et comment puis-je l'utiliser pour déboguer mes erreurs d'application?
Le Problème
votre demande a cessé parce qu'un RuntimeException
a été lancé.
Le plus commun d'entre eux est le NullPointerException
.
Comment le résoudre?
chaque fois qu'une application Android tombe en panne (ou n'importe quelle application Java d'ailleurs), un Stack trace
est écrit sur la console (dans ce cas, logcat). Cette pile contient des informations vitales pour résoudre votre problème.
Android Studio
Dans la barre inférieure de la fenêtre, cliquez sur le Logcat
bouton. Vous pouvez aussi appuyer sur alt + 6 . Assurez-vous que votre émulateur ou appareil est sélectionné dans le panneau Devices
. Ensuite, essayez de trouver la trace de la pile, qui est indiqué en rouge. Il peut y avoir beaucoup de choses connectés dans logcat, donc vous pouvez avoir besoin de faire défiler un peu. Un moyen facile de trouver la trace de la pile est de nettoyer le logcat (en utilisant la corbeille sur la droite), et laisser l'application se planter à nouveau.
j'ai trouvé la trace de la pile, maintenant ce qui?
Yay! Tu es à mi-chemin pour résoudre ton problème.
Vous avez seulement besoin de savoir ce qui a exactement fait planter votre application, en analysant la trace de la pile.
lire sur les traces de pile dans " Qu'est-ce qu'une trace de pile, et comment puis-je l'utiliser pour déboguer mes erreurs d'application? "
Je ne peux toujours pas résoudre mon problème!
si vous avez trouvé votre Exception
et la ligne où il s'est produit, et ne peut toujours pas comprendre comment le réparer, n'hésitez pas à poser une question sur StackOverflow.
essayez d'être aussi concis que possible: postez la trace de la pile, et le code pertinent (par exemple quelques lignes jusqu'à la ligne qui a lancé le Exception
).
vous pouvez utiliser l'outil de Bad de Google pour obtenir Logcat file
pour analyser la question.
adb logcat > logcat.txt
ouvrir logcat.txt
ficher et rechercher votre nom de demande. Il devrait y avoir des informations sur la raison de l'échec, le numéro de ligne ,Le nom de la classe, etc.
tout d'abord, vous vérifiez quel point votre application a crashé ( Unfortunately, MyApp has stopped.
). Pour cela, vous pouvez utiliser Log.e("TAG","Message");
, en utilisant cette ligne vous pouvez voir l'application vous connecter dans logcat.
Après que vous trouvez que votre application a cessé son très facile à résoudre, à vos côtés.
il suffit de vérifier l'erreur dans log cat.
vous obtenez l'option log cat dans eclipse:
Fenêtre- > Afficher l'image- > autres- > Android - >Logcat
Journal de chat contient des erreurs.
vous pouvez également vérifier l'erreur en exécutant une application en mode de débogage. D'abord fixer le point de rupture après cela en faisant:
clic droit sur le projet->debug as - > Android application
Note: cette réponse utilise Android Studio 2.2.2
Note 2: je considère que votre appareil est connecté avec succès.
la première chose que vous faites lorsque votre application plante est de regarder dans le LogCat, au bas de Android Studio Il ya une barre d'outils avec une liste des menus:
cliquez sur" Android Monitor " (celui que j'ai souligné dans l'image ci-dessus. ^ )
Maintenant, vous obtiendrez quelque chose comme ceci:
changer" Verbose
"en Error
" maintenant, il ne montrera que vous avez enregistré des erreurs. Ne vous inquiétez pas à propos de tous ces les erreurs (si vous les avez).
Ok. Maintenant, faites ce que vous avez fait pour planter votre application. Après le crash de votre application, allez sur votre logcat. Vous devriez trouver un nouveau crash qui a beaucoup de at:x.x.x
: et Caused by: TrumpIsPresidentException
par exemple. Allez à la déclaration Caused by:
dans votre logcat.
à côté de que Caused By:
, il devrait y avoir L'Exception qui s'est produite. Dans mon cas, c'est une RuntimeException
et sous elle il devrait y avoir une ligne qui contient un lien bleu tel que:
si cette Caused by:
N'a pas de ligne avec un texte bleu quelque part en dessous, alors regardez pour un autre Caused by:
qui fait.
cliquez sur ce lien bleu . Il devrait vous prendre à l'endroit où le problème s'est produit. Dans mon cas, il était dû à cette ligne:
throw new RuntimeException();
donc, maintenant je sais pourquoi il s'effondre. C'est parce que je lance l'exception moi-même. c'était une erreur évidente .
cependant, disons que j'ai une autre erreur:
java.lang.NullPointerException
j'ai vérifié mon logcat, j'ai cliqué sur le lien bleu qu'il m'a donné, et il m'a pris ici:
mTextView.setText(myString);
donc, maintenant je veux déboguer. Selon cette question de flux StackOverflow , une exception NullPointerException dit que quelque chose est null
.
alors, trouvons ce qui est nul . Il y a deux possibilités. Soit mTextView
est nul, soit myString
est nul. Trouver dehors, avant la ligne mTextView.setText(mString)
, j'ajoute ces deux lignes:
Log.d("AppDebug","mTextView is null: " + String.valueOf(mTextView == null);
Log.d("AppDebug","myString is null: " + String.valueOf(myString== null);
maintenant, comme nous l'avons fait précédemment (nous avons changé Verose en erreur), nous voulons changer "erreur" en "Debug". Depuis qu'on se connecte par débogage. Voici toutes les méthodes de 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
donc , depuis que nous avons utilisé Log.d
, nous vérifions dans Debug. C'est pourquoi nous l'avons changé de débogage.
Notice Log.d
a un premier paramètre,dans notre cas"AppDebug". Cliquez sur le menu déroulant" pas de filtres " en haut à droite du logcat. Sélectionnez "Modifier la Configuration du filtre", donnez un nom à votre filtre, et dans" Log Tag "mettez"L'application de débogage". Cliquez sur "OK". Maintenant, vous devriez voir deux lignes dans le logcat:
yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false
donc maintenant nous savons que mTextView est null.
j'observe mon code, maintenant je remarque quelque chose.
j'ai private TextView mTextView
, a déclaré au sommet de ma classe. Mais, je ne suis pas la définir.
en gros, J'ai oublié de le faire dans mon onCreate ():
mTextView = (TextView) findViewById(R.id.textview_id_in_xml);
donc c'est pour ça que mTextView
est nul, parce que j'ai oublié de dire à mon application ce que c'est. J'ai donc ajouter cette ligne, exécuter mon application, et maintenant l'appli ne plante pas.
ce popup ne s'affiche que lorsque vous obtenez une exception fatale dans votre code qui arrête l'exécution de l'application. Il pourrait s'agir de N'importe quelle exception NullPointerException, Outofmoryexception etc.
la meilleure façon de vérifier est par Logcat si vous êtes encore en développement de l'application dans Android studio qui est un moyen rapide de lire la pile de trace et de vérifier la cause de l'application.
si votre application est déjà live, alors vous ne pouvez pas utiliser logcat. Donc, pour cela, vous pouvez mettre en œuvre Crashlytics pour vous fournir des rapports de bogue de toute exception qui se produit.
Vérifiez votre message Logcat
et consultez votre fichier Manifest
. Il devrait y avoir quelque chose qui manque comme définir la Activity,
permission de L'utilisateur", etc.
vous pouvez utiliser l'un de ces outils:
adb logcat
ADB logcat > logs.txt (vous pouvez utiliser des éditeurs pour ouvrir et rechercher des erreurs.)
eclipse logcat (si elle n'est pas visible dans eclipse, allez sur Windows - > Show View- > Others - > Android - >LogCat)
- Android Debug Monitor ou Android Device Monitor(type la commande moniteur ou ouvrez à l'aide de l'INTERFACE utilisateur)
- Android Studio
je suggère d'utiliser Android Debug Monitor , il est bon. Parce que eclipse se bloque quand Trop de logs sont là, et à travers le filtre logcat d'adb et tous difficiles.
vous devez vérifier le Stack trace
Comment faire?
sur votre IDE, vérifiez le formulaire LOGCAT de windows
si vous ne voyez pas les fenêtres logcat, allez sur ce chemin et ouvrez-le
window->show view->others->Android->Logcat
si vous utilisez Google-Api aller à ce chemin ""
adb logcat > logcat.txt
Permettez-moi de partager une analyse Logcat de base pour quand vous rencontrez une force de fermeture (quand l'application cesse de fonctionner).
DOCS
outil de base D'Android pour collecter/analyser les journaux est le logcat.
ici est la page de l'Android à propos de logcat
si vous utilisez android Studio, vous pouvez également vérifier ce lien .
capture
essentiellement, vous pouvez capturer manuellement logcat avec la commande suivante (ou juste vérifier la fenêtre AndroidMonitor dans AndroidStudio):
adb logcat
il y a beaucoup de paramètres que vous pouvez ajouter à la commande qui vous aide à filtrer et à afficher le message que vous voulez... C'est personnel... J'utilise toujours la commande ci-dessous pour obtenir le timestamp message:
adb logcat -v time
vous pouvez rediriger la sortie vers un fichier et l'analyser dans un éditeur de texte.
analyse
si votre application tombe en panne, vous obtiendrez quelque chose comme:
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.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
cette partie du journal vous montre beaucoup d'informations:
- quand la question Est Arrivée:
07-09 08:29:13.475
Il est important de bien vérifier si le problème est arrivé... Vous pouvez trouver plusieurs erreurs dans un journal... vous devez être sûr que vous vérifiez les messages appropriés:)
- l'application s'est écrasé:
com.example.khan.abc
de cette façon, vous savez quelle application s'est écrasée (pour être sûr que vous vérifiez les journaux de votre message)
- quelle erreur:
java.lang.NullPointerException
UNE Exception de Pointeur NULL erreur
- Informations détaillées sur l'erreur:
Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference
vous avez essayé d'appeler la méthode onBackPressed()
à partir d'un objet FragmentActivity
. Cependant, cet objet était null
quand vous l'avez fait.
-
Stack Trace: Stack Trace vous montre l'ordre d'invocation de la méthode... Parfois, l'erreur se produit dans la méthode d'appel (et non dans la méthode appelée).
à COM.exemple.Khan.ABC.AudioFragment$1.onClick (AudioFragment.java: 125)
Erreur qui s'est passé dans le fichier com.example.khan.abc.AudioFragment.java
, à l'intérieur de onClick()
méthode à la ligne: 125
(stacktrace montre la ligne d'erreur qui s'est passé)
il a été appelé par:
at android.view.View.performClick(View.java:4848)
qui a été appelé par:
at android.view.View$PerformClick.run(View.java:20262)
qui a été appelé par:
at android.os.Handler.handleCallback(Handler.java:815)
etc....
vue d'ensemble
ce n'était qu'un aperçu... Tous les logs ne sont pas simples, etc... Il s'agit simplement de partager l'idée et de vous fournir une information de base...
j'espère pouvoir vous aider... Concernant
dans la méthode showToast() ci-dessous, vous devez passer un autre paramètre pour le contexte ou le contexte de l'application pour pouvoir l'essayer.
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();
}
utilisez le LogCat et essayer de trouver ce qui cause le plantage de l'application.
pour voir Logcat si vous utilisez Android Studio puis appuyez sur ALT + 6 ou
si vous utilisez Eclipse alors Fenêtre- > Open Perspective - > Other-LogCat
aller à la LogCat, à partir du menu déroulant Sélectionner erreur. Cela va contenir toutes les informations nécessaires pour vous aider à déboguer. Si cela ne vous aide pas, postez le LogCat comme une édition de votre question et quelqu'un vous aidera.
si votre application pour une raison quelconque se bloque sans bon stacktrace. Essayez de déboguer partir de la première ligne, et aller ligne par ligne jusqu'à ce crash. Alors vous aurez la réponse, quelle ligne vous cause des problèmes. Proably vous pourriez alors l'envelopper dans le bloc de capture d'essai et imprimer la sortie d'erreur.
vous pouvez également obtenir ce message d'erreur par lui-même, sans aucune trace de pile ou tout autre message d'erreur.
dans ce cas, vous devez vous assurer que votre manifeste Android est configuré correctement (y compris tout manifeste fusionnant se produire à partir d'une bibliothèque et toute activité qui viendrait d'une bibliothèque), et faire une attention particulière à la première activité affichée dans votre application dans vos fichiers manifestes.
Crash pendant le développement
Essayer logview-0.20 pour obtenir les fichiers journaux et les analyser au cours du développement.
Assurez-vous de marquer ./logview
et ./lib/logview.jar
comme exécutable sous Linux.
Si vous ne l'aimez pas, il y a beaucoup d'alternative bureau du journal de téléspectateurs pour Android .
Crash dans la nature
intègre un outil de Compte rendu d'accident en temps réel tel que Firebase Crashlytics afin d'obtenir des empilements d'exceptions non contrôlées qui se sont produites sur les appareils des utilisateurs.
Lire comment publier une application Buggy (et vivre pour raconter l'histoire) pour en savoir plus sur la manipulation des bogues dans le domaine.
les gens font des erreurs, et donc aussi du codage.
quand jamais n'importe quel error
est arrivé, toujours vérifier avec le logcat avec le texte en couleur rouge cependant u peut trouver le vrai problème en texte en couleur bleue avec le soulignement dans ces texte en couleur rouge.
assurez-vous que si u crée un nouveau activity
, déclarez toujours le activity
dans le fichier AndroidManifest
.
si vous ajoutez une Permission, déclarez-la dans le fichier AndroidMainifest
aussi.