Remarque: Cette réponse utilise Android Studio 2.2.2
Remarque 2: je considère que votre appareil est correctement connecté.
La première chose que vous faites lorsque votre application se bloque est de regarder dans LogCat, au bas d'Android Studio, il y a une barre d'outils avec une liste de menus:
Cliquez sur "Android Monitor" (celui que j'ai souligné dans l'image ci-dessus. ^)
Maintenant, vous obtiendrez quelque chose comme ceci:
Remplacez " Verbose
" par " Error
" Maintenant, seules les erreurs enregistrées seront affichées. Ne vous inquiétez pas de toutes ces erreurs (si vous les avez) maintenant.
D'accord. Maintenant, faites ce que vous avez fait pour planter votre application. Après le blocage de votre application, accédez à votre logcat. Vous devriez trouver un nouveau journal des plantages qui contient beaucoup de at:x.x.x
: et Caused by: TrumpIsPresidentException
par exemple. Accédez à cette Caused by:
déclaration dans votre logcat.
À côté de cela 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 tel que:
Si celaCaused by:
N'A PAS de ligne avec un texte bleu quelque part en dessous, alors cherchez une autre Caused by:
qui en a.
Cliquez sur ce lien bleu . Il devrait vous emmener là où le problème est survenu. Dans mon cas, c'était dû à cette ligne:
throw new RuntimeException();
Donc, maintenant je sais pourquoi ça plante. C'est parce que je lève moi-même l'exception. 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. Selon cette question StackOverflow , une NullPointerException indique que quelque chose existe null
.
Voyons donc ce qui est nul . Il y a deux possibilités. Soit mTextView
null, soit myString
null. Pour savoir, avant la mTextView.setText(mString)
ligne, 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 nous connectons par débogage. 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, depuis que nous l'avons utilisé Log.d
, nous archivons Debug. C'est pourquoi nous l'avons changé pour déboguer.
Remarque 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 "App Debug". Cliquez sur OK". Maintenant, vous devriez voir deux lignes dans le logcat:
yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false
Alors maintenant, nous savons que mTextView est nul.
J'observe mon code, maintenant je remarque quelque chose.
Je l'ai private TextView mTextView
déclaré en tête de ma classe. Mais je ne le définis pas.
Fondamentalement, j'ai oublié de le faire dans mon onCreate ():
mTextView = (TextView) findViewById(R.id.textview_id_in_xml);
Voilà pourquoi mTextView
est nul, car j'ai oublié de dire à mon application de quoi il s'agit. J'ajoute donc cette ligne, exécute mon application et maintenant l'application ne plante plus.