Hinweis: Diese Antwort verwendet Android Studio 2.2.2
Hinweis 2: Ich gehe davon aus, dass Ihr Gerät erfolgreich verbunden wurde.
Das erste, was Sie tun, wenn Ihre Anwendung abstürzt, ist ein Blick in die LogCat. Am Ende von Android Studio befindet sich eine Symbolleiste mit einer Liste von Menüs:
Klicken Sie auf den "Android Monitor" (den, den ich im obigen Bild unterstrichen habe. ^)
Jetzt erhalten Sie ungefähr Folgendes:
Ändern Sie " Verbose
" in " Error
". Jetzt werden nur noch protokollierte Fehler angezeigt. Mach dir jetzt keine Sorgen über all diese Fehler (wenn du sie hast).
OK. Tun Sie jetzt, was Sie getan haben, um Ihre App zum Absturz zu bringen. Wechseln Sie nach dem Absturz Ihrer App zu Ihrem Logcat. Sie sollten ein neues Absturzprotokoll finden, das viele enthält at:x.x.x
: und Caused by: TrumpIsPresidentException
zum Beispiel. Gehen Sie zu dieser Caused by:
Anweisung in Ihrem Logcat.
Neben , dass Caused By:
, sollte es die Ausnahme sein, was geschehen. In meinem Fall ist es ein RuntimeException
und darunter sollte eine Zeile stehen, die einen blauen Link enthält , wie zum Beispiel:
Wenn dasCaused by:
KEINE Zeile mit einem blauen Text irgendwo darunter hat, suchen Sie nach einer anderen Caused by:
, die dies tut.
Klicken Sie auf diesen blauen Link . Es sollte Sie dorthin bringen, wo das Problem aufgetreten ist. In meinem Fall lag es an dieser Zeile:
throw new RuntimeException();
Jetzt weiß ich also, warum es abstürzt. Es ist, weil ich die Ausnahme selbst werfe. Dies war ein offensichtlicher Fehler .
Nehmen wir jedoch an, ich habe einen weiteren Fehler erhalten:
java.lang.NullPointerException
Ich habe meinen Logcat überprüft, auf den blauen Link geklickt, den er mir gegeben hat, und er hat mich hierher geführt:
mTextView.setText(myString);
Also, jetzt möchte ich debuggen. Gemäß dieser StackOverflow-Frage sagt eine NullPointerException, dass etwas ist null
.
Lassen Sie uns also herausfinden, was null ist . Es gibt zwei Möglichkeiten. Entweder mTextView
ist null oder myString
ist null. Um herauszufinden, mTextView.setText(mString)
füge ich vor der Zeile diese beiden Zeilen hinzu:
Log.d("AppDebug","mTextView is null: " + String.valueOf(mTextView == null);
Log.d("AppDebug","myString is null: " + String.valueOf(myString== null);
Jetzt, wie zuvor (wir haben Verose in Error geändert), möchten wir "Error" in "Debug" ändern. Da wir uns durch Debuggen anmelden. Hier sind alle Protokollmethoden:
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
Da wir verwendet haben Log.d
, checken wir Debug ein. Deshalb haben wir es in Debug geändert.
Hinweis Log.d
hat einen ersten Parameter, in unserem Fall "AppDebug". Klicken Sie oben rechts im Logcat auf das Dropdown-Menü "Keine Filter". Wählen Sie "Filterkonfiguration bearbeiten", geben Sie Ihrem Filter einen Namen und geben Sie in "Log Tag" "App Debug" ein. OK klicken". Jetzt sollten im Logcat zwei Zeilen angezeigt werden:
yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false
Jetzt wissen wir also, dass mTextView null ist.
Ich beobachte meinen Code, jetzt merke ich etwas.
Ich habe mich private TextView mTextView
an der Spitze meiner Klasse erklärt. Aber ich definiere es nicht.
Grundsätzlich habe ich vergessen, dies in meinem onCreate () zu tun:
mTextView = (TextView) findViewById(R.id.textview_id_in_xml);
Deshalb mTextView
ist das null, weil ich vergessen habe, meiner App zu sagen, was es ist. Also füge ich diese Zeile hinzu, starte meine App und jetzt stürzt die App nicht ab.