Hinweis: Diese Antwort verwendet Android Studio 2.2.2
Hinweis 2: Ich gehe davon aus, dass Ihr Gerät erfolgreich verbunden ist.
Das Erste, was Sie tun, wenn Ihre Anwendung abstürzt, ist einen Blick in den LogCat zu werfen. Am unteren Rand von Android Studio befindet sich eine Symbolleiste mit einer Liste von Menüs:
Klicken Sie auf "Android Monitor" (Das, was ich im obigen Bild unterstrichen habe. ^)
Jetzt sehen Sie etwas Ähnliches wie dies:
Ändern Sie "Verbose
" zu "Error
". Jetzt werden Ihnen nur noch protokollierte Fehler angezeigt. Machen Sie sich vorerst keine Sorgen über all diese Fehler (falls es welche gibt).
Ok. Nun, tun Sie das, was dazu führt, dass Ihre App abstürzt. Nachdem Ihre App abstürzt, gehen Sie zu Ihrem Logcat. Dort sollten Sie ein neues Crash-Protokoll finden, das viele at:x.x.x
: und Caused by: TrumpIsPresidentException
enthält. Gehen Sie zu dieser Caused by:
Aussage in Ihrem Logcat.
Unmittelbar nächsten zu diesem Caused By:
sollte die Exception stehen, die aufgetreten ist. In meinem Fall ist es eine RuntimeException
und darunter sollte eine Zeile stehen, die einen blauen Link enthält, wie zum Beispiel:
Wenn bei diesem Caused by:
keine Zeile mit blauem Text darunter steht, suchen Sie nach einem anderen Caused by:
, der das tut.
Klicken Sie auf diesen blauen Link. Er sollte Sie dorthin bringen, wo das Problem aufgetreten ist. In meinem Fall war es aufgrund dieser Zeile:
throw new RuntimeException();
Also weiß ich jetzt, warum es abstürzt. Es liegt daran, dass ich die Ausnahme selbst werfe. Dies war ein offensichtlicher Fehler.
Angenommen, ich erhalte einen anderen Fehler:
java.lang.NullPointerException
Ich überprüfte mein Logcat, klickte auf den blauen Link, den es mir gab, und er brachte mich hierhin:
mTextView.setText(myString);
Also möchte ich jetzt debuggen. Laut dieser StackOverflow-Frage heißt eine NullPointerException, dass etwas null
ist.
Also finden wir heraus, was null ist. Es gibt zwei Möglichkeiten. Entweder ist mTextView
null oder myString
ist null. Um das herauszufinden, füge ich vor der Zeile mTextView.setText(mString)
diese beiden Zeilen hinzu:
Log.d("AppDebug","mTextView ist null: " + String.valueOf(mTextView == null);
Log.d("AppDebug","myString ist null: " + String.valueOf(myString== null);
Jetzt, wie wir zuvor gemacht haben (Wir haben Verose in Error geändert), wollen wir "Error" in "Debug" ändern. Da wir gerade debuggen, sind loggen. Hier sind alle Logmethoden:
Log.
d bedeutet Debug
e bedeutet Fehler
w bedeutet Warnung
v bedeutet ausführlich
i bedeutet Information
wtf bedeutet "Was für ein schrecklicher Fehler". Dies ist ähnlich wie Log.e
Da wir Log.d
verwendet haben, überprüfen wir im Debug-Modus. Deshalb haben wir es in debug geändert.
Beachten Sie, dass Log.d
einen ersten Parameter hat, in unserem Fall "AppDebug". Klicken Sie auf das Dropdown-Menü "Keine Filter" oben rechts im Logcat. Wählen Sie "Filterkonfiguration bearbeiten", geben Sie Ihrem Filter einen Namen und geben Sie im "Log-Tag" "App Debug" ein. Klicken Sie auf "OK". Jetzt sollten Sie zwei Zeilen im Logcat sehen:
IhrPaketNameUndApp: mTextView ist null: true
IhrPaketNameUndApp: myString ist null: false
Jetzt wissen wir also, dass mTextView null ist.
I betrachte meinen Code, jetzt bemerke ich etwas.
Ich habe private TextView mTextView
am Anfang meiner Klasse deklariert. Aber ich definiere es nicht.
Grundlegend habe ich vergessen, dies in meinem onCreate() zu tun:
mTextView = (TextView) findViewById(R.id.textview_id_in_xml);
Also IST DAS der Grund, warum mTextView
null ist, weil ich meiner App vergessen habe, was es ist. Also füge ich diese Zeile hinzu, starte meine App und jetzt stürzt die App nicht ab.