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 se plante est de regarder dans le LogCat, en bas d'Android Studio il y a une barre d'outils avec une liste de menus :
Cliquez sur le "Android Monitor" (Celui que j'ai souligné dans l'image ci-dessus. ^)
Maintenant, vous obtiendrez quelque chose comme ça :
Changement " Verbose
" à " Error
" Maintenant, il ne vous montrera que les erreurs enregistrées. Ne vous inquiétez pas de toutes ces erreurs (si vous en avez) maintenant.
Ok. Maintenant, fais ce que tu as fait pour faire planter ton application. Après que ton application se soit plantée, va dans ton logcat. Tu devrais trouver un nouveau log de crash qui a beaucoup de at:x.x.x
: et Caused by: TrumpIsPresidentException
par exemple. Allez-y Caused by:
dans votre logcat.
Suivant que Caused By:
il devrait y avoir l'exception qui s'est produite. Dans mon cas, c'est un RuntimeException
et en dessous il devrait y avoir une ligne qui contient un lien bleu comme :
Si cela Caused by:
N'A PAS de ligne avec un texte bleu quelque part en dessous, alors cherchez une autre Caused by:
qui le fait.
Cliquez sur le lien bleu . Cela devrait vous conduire à 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 se plante. 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 amené ici :
mTextView.setText(myString);
Donc, maintenant je veux déboguer. D'après cette question de StackOverflow une NullPointerException dit que quelque chose est null
.
Alors, découvrons qu'est-ce que la nullité . Il y a deux possibilités. Soit mTextView
est nulle, ou myString
est nulle. Pour le savoir, avant que le 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 Error), nous voulons changer "Error" en "Debug". Puisque nous enregistrons en déboguant. Voici toutes les méthodes de journalisation :
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, puisque nous avons utilisé Log.d
nous vérifions dans Debug. C'est pourquoi nous l'avons changé en debug.
Avis Log.d
a un premier paramètre, dans notre cas "AppDebug". Cliquez sur le menu déroulant "No Filters" en haut à droite du logcat. Sélectionnez "Edit Filter Configuration", donnez un nom à votre filtre, et dans "Log Tag" mettez "App Debug". Cliquez sur "OK". Maintenant, vous devriez voir deux lignes dans le logcat :
yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false
Nous savons donc maintenant que mTextView est nul.
J'observe mon code, maintenant je remarque quelque chose.
J'ai private TextView mTextView
déclarée première de ma classe. Mais, je ne le définis pas.
En fait, j'ai oublié de le faire dans mon onCreate() :
mTextView = (TextView) findViewById(R.id.textview_id_in_xml);
Alors c'est pourquoi mTextView
est nulle, parce que j'ai oublié de dire à mon application ce que c'est. Donc j'ajoute cette ligne, je lance mon application, et maintenant l'application ne plante plus.
29 votes
J'ai vu de nombreuses questions être fermées en tant que doublons avec cela. C'est une bonne référence pour aider les gens à poster des données pertinentes dans leurs questions. Cependant, il ne s'agit pas d'une duplication d'un problème fondamental, mais simplement d'une méthodologie permettant de déterrer le problème fondamental. Je pense qu'il serait préférable de fournir le lien vers cette question comme référence et de ne pas la fermer comme doublon.
37 votes
Je pense que la fonction de fermeture est parfaite pour cela. La plupart de ces questions montrent une faible connaissance des compétences de base en matière de débogage. Le fait de les mettre en attente leur donne l'occasion de clarifier leur problème, en utilisant la méthode indiquée dans la réponse. Mieux encore, ils pourraient être en mesure de résoudre le problème eux-mêmes. Cette discussion serait peut-être mieux adaptée à meta.stackoverflow.com.
0 votes
Cette question est trop vague. Une meilleure question serait "en utilisant [myIDE] comment puis-je déboguer une application Android qui affiche l'erreur "Malheureusement, MyApp s'est arrêtée"".
8 votes
@ChrisHalcrow Cette question/réponse ne concerne pas du tout le débogage. Il s'agit de guider les débutants dans Android sur la manière de gérer les plantages d'applications.