Ich entwickle eine Anwendung und jedes Mal, wenn ich sie ausführe, erhalte ich die folgende Meldung:
Leider hat MyApp aufgehört.
Was kann ich tun, um das zu lösen?
Zu dieser Frage - offensichtlich inspiriert von Was ist ein Stack-Trace und wie kann ich damit meine Anwendungsfehler debuggen? Es gibt viele Fragen, die besagen, dass ihre Anwendung ohne weitere Details abgestürzt ist. Diese Frage zielt darauf ab, unerfahrene Android-Programmierer darin zu unterweisen, wie sie versuchen können, ihre Probleme selbst zu beheben oder die richtigen Fragen zu stellen.
Antworten:
Diese Antwort beschreibt den Vorgang des Abrufens der Stapelverfolgung. Haben Sie bereits die Stapelverfolgung? Informationen zu Stack-Traces finden Sie unter " Was ist ein Stack-Trace und wie kann ich damit meine Anwendungsfehler debuggen? "
Das Problem
Ihre Bewerbung wurde beendet, weil ein Ungefangener
RuntimeException
geworfen wurde.Die häufigste davon ist die
NullPointerException
.Wie man es löst?
Jedes Mal, wenn eine Android-Anwendung abstürzt (oder eine Java-Anwendung),
Stack trace
wird a in die Konsole geschrieben (in diesem Fall logcat). Diese Stapelverfolgung enthält wichtige Informationen zur Lösung Ihres Problems.Android Studio
Klicken Sie in der unteren Leiste des Fensters auf die
Logcat
Schaltfläche. Alternativ können Sie alt+ drücken 6. Stellen Sie sicher, dass Ihr Emulator oder Gerät imDevices
Bedienfeld ausgewählt ist. Versuchen Sie als Nächstes, die Stapelverfolgung zu finden, die rot angezeigt wird. Möglicherweise sind viele Dinge in logcat angemeldet, daher müssen Sie möglicherweise ein wenig scrollen. Eine einfache Möglichkeit, den Stack-Trace zu finden, besteht darin, den Logcat zu löschen (mithilfe des Papierkorbs auf der rechten Seite) und die App erneut abstürzen zu lassen.Ich habe die Stapelverfolgung gefunden, was nun?
Yay! Sie sind auf halbem Weg zur Lösung Ihres Problems.
Sie müssen nur herausfinden, was genau Ihre Anwendung zum Absturz gebracht hat, indem Sie den Stack-Trace analysieren.
Informationen zu Stack-Traces finden Sie unter " Was ist ein Stack-Trace und wie kann ich damit meine Anwendungsfehler debuggen? "
Ich kann mein Problem immer noch nicht lösen!
Wenn Sie Ihre
Exception
und die Zeile gefunden haben, in der sie aufgetreten ist, und immer noch nicht herausfinden können, wie sie behoben werden können, zögern Sie nicht, eine Frage zu StackOverflow zu stellen.Versuchen Sie, so präzise wie möglich zu sein: Veröffentlichen Sie den Stack-Trace und den entsprechenden Code (z. B. ein paar Zeilen bis zu der Zeile, die den geworfen hat
Exception
).quelle
Android > Devices|Logcat
und einen neuen Filter (add i.imgur.com/145dtkx.png ), und es Filter fürby Log Message
hier können Sie setzenFATAL EXCEPTION
( i.imgur.com/HpELhaU .png ) so können Sie in dieser Box alle lesen,Exceptions
die von Ihrer Anwendung geworfen werden. Damit müssen Sie logcat nicht löschen und den Absturz erneut ausführen. Ich denke, Android Studio hat diese Option auch.Sie können das ADB-Tool von Google verwenden , um
Logcat file
das Problem zu analysieren.Öffnen Sie die
logcat.txt
Datei und suchen Sie nach Ihrem Anwendungsnamen. Es sollte Informationen darüber geben, warum es fehlgeschlagen ist, die Zeilennummer, den Klassennamen usw.quelle
-d
, andernfalls wechseln Sie zu Strg-C, um logcat zu beenden. Ich tueadb logcat -v time -d > filename.txt
Zuerst überprüfen Sie, an welcher Stelle Ihre App abgestürzt ist (
Unfortunately, MyApp has stopped.
). Hierfür können SieLog.e("TAG", "Message");
über diese Zeile Ihr App-Log in Logcat sehen.Danach finden Sie heraus, welcher Punkt Ihre App gestoppt hat. Es ist sehr einfach, ihn an Ihrer Seite zu lösen.
quelle
Überprüfen Sie einfach den Fehler in log cat.
Sie erhalten die Option log cat von in Eclipse:
Protokollkatze enthält Fehler.
Andernfalls können Sie den Fehler auch überprüfen, indem Sie eine Anwendung im Debug-Modus ausführen. Setzen Sie danach zunächst den Haltepunkt, indem Sie Folgendes tun:
quelle
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
: undCaused by: TrumpIsPresidentException
zum Beispiel. Gehen Sie zu dieserCaused by:
Anweisung in Ihrem Logcat.Neben , dass
Caused By:
, sollte es die Ausnahme sein, was geschehen. In meinem Fall ist es einRuntimeException
und darunter sollte eine Zeile stehen, die einen blauen Link enthält , wie zum Beispiel:Wenn das
Caused by:
KEINE Zeile mit einem blauen Text irgendwo darunter hat, suchen Sie nach einer anderenCaused 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:
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:
Ich habe meinen Logcat überprüft, auf den blauen Link geklickt, den er mir gegeben hat, und er hat mich hierher geführt:
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 odermyString
ist null. Um herauszufinden,mTextView.setText(mString)
füge ich vor der Zeile diese beiden Zeilen hinzu: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:
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: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:
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.quelle
Dieses Popup wird nur angezeigt, wenn in Ihrem Code eine schwerwiegende Ausnahme auftritt, die die Ausführung der App stoppt. Es könnte jede Ausnahme sein
NullPointerException
,OutOfMemoryException
etc.Am besten überprüfen Sie über Logcat, ob Sie die App noch in Android Studio entwickeln. Auf diese Weise können Sie schnell die Stapelverfolgung lesen und die Ursache der App überprüfen.
Wenn Ihre App bereits aktiv ist, können Sie logcat nicht verwenden . Zu diesem Zweck können
Crashlytics
Sie Fehlerberichte für alle auftretenden Ausnahmen implementieren .quelle
Überprüfen Sie Ihre
Logcat
Nachricht und sehen Sie IhreManifest
Datei. Es sollte etwas fehlen, wie das Definieren derActivity,
Benutzerberechtigung usw.quelle
Sie können eines dieser Tools verwenden:
Ich schlage vor, Android Debug Monitor zu verwenden , es ist gut. Weil Eclipse hängt, wenn zu viele Protokolle vorhanden sind, und durch den ADB-Logcat-Filter und alles schwierig.
quelle
Sie müssen das überprüfen
Stack trace
Wie geht das?
auf Ihrer IDE Überprüfen Sie die Fenster von LOGCAT
Wenn Sie die Logcat-Fenster nicht sehen können, gehen Sie zu diesem Pfad und öffnen Sie ihn
Wenn Sie Google-Api verwenden, gehen Sie zu diesem Pfad
adb logcat> logcat.txt
quelle
In der folgenden showToast () -Methode müssen Sie einen anderen Parameter für den Kontext oder den Anwendungskontext übergeben, indem Sie dies versuchen.
quelle
Lassen Sie mich eine grundlegende Logcat-Analyse für den Fall teilen, dass Sie einen Force Close treffen (wenn die App nicht mehr funktioniert).
DOCS
Das grundlegende Tool von Android zum Sammeln / Analysieren von Protokollen ist der Logcat.
HIER ist die Android-Seite über Logcat
Wenn Sie Android Studio verwenden, können Sie diesen LINK auch überprüfen .
Erfassen
Grundsätzlich können Sie logcat mit dem folgenden Befehl MANUELL erfassen (oder einfach das AndroidMonitor-Fenster in AndroidStudio überprüfen):
Es gibt viele Parameter, die Sie dem Befehl hinzufügen können, mit denen Sie die gewünschte Nachricht filtern und anzeigen können ... Dies ist persönlich ... Ich verwende immer den folgenden Befehl, um den Zeitstempel der Nachricht abzurufen:
Sie können die Ausgabe in eine Datei umleiten und in einem Texteditor analysieren.
Analysieren
Wenn Ihre App abstürzt, erhalten Sie Folgendes:
Dieser Teil des Protokolls zeigt Ihnen viele Informationen:
07-09 08:29:13.475
Es ist wichtig zu überprüfen, wann das Problem aufgetreten ist ... Möglicherweise finden Sie mehrere Fehler in einem Protokoll ... Sie müssen sicher sein, dass Sie die richtigen Meldungen überprüfen :)
com.example.khan.abc
Auf diese Weise wissen Sie, welche App abgestürzt ist (um sicherzugehen, dass Sie die Protokolle Ihrer Nachricht überprüfen).
java.lang.NullPointerException
Ein NULL-Zeiger-Ausnahmefehler
Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference
Sie haben versucht, die Methode
onBackPressed()
von einemFragmentActivity
Objekt aus aufzurufen . Dieses Objekt war jedoch,null
als Sie es getan haben.Stapelverfolgung: Die Stapelverfolgung zeigt Ihnen die Reihenfolge des Methodenaufrufs an ... Manchmal tritt der Fehler in der aufrufenden Methode (und nicht in der aufgerufenen Methode) auf.
at com.example.khan.abc.AudioFragment $ 1.onClick (AudioFragment.java:125)
Fehler in Datei
com.example.khan.abc.AudioFragment.java
, innerhalb deronClick()
Methode in Zeile:125
(Stacktrace zeigt die Zeile, in der der Fehler aufgetreten ist)Es wurde aufgerufen von:
Welches wurde aufgerufen von:
welches aufgerufen wurde von:
usw....
Überblick
Dies war nur eine Übersicht ... Nicht alle Protokolle sind einfach usw. ... Es dient nur dazu, die Idee zu teilen und Ihnen Informationen für Einsteiger bereitzustellen ...
Ich hoffe ich konnte dir irgendwie helfen ... Grüße
quelle
Verwenden Sie die LogCat und versuchen Sie herauszufinden, was den Absturz der App verursacht.
Um zu sehen , Logcat wenn Sie verwenden Android Studio dann Drücken Sie ALT + 6 oder
Wenn Sie Eclipse verwenden, dann Fenster -> Perspektive öffnen -> Andere - LogCat
Gehen Sie zu LogCat und wählen Sie im Dropdown-Menü einen Fehler aus. Diese enthält alle erforderlichen Informationen zum Debuggen. Wenn dies nicht hilft, senden Sie die LogCat als Bearbeitung an Ihre Frage, und jemand wird Ihnen helfen.
quelle
Wenn Ihre App aus irgendeinem Grund ohne gute Stapelverfolgung abstürzt. Versuchen Sie, es in der ersten Zeile zu debuggen, und gehen Sie Zeile für Zeile bis zum Absturz. Dann haben Sie eine Antwort, welche Leitung Ihnen Probleme bereitet. Wahrscheinlich könnten Sie es dann in try catch block verpacken und Fehler ausgeben.
quelle
Sie können diese Fehlermeldung auch einzeln erhalten, ohne Stapelverfolgung oder weitere Fehlermeldung.
In diesem Fall müssen Sie sicherstellen, dass Ihr Android-Manifest korrekt konfiguriert ist (einschließlich der Zusammenführung von Manifesten aus einer Bibliothek und aller Aktivitäten, die aus einer Bibliothek stammen würden), und besonders auf die erste Aktivität achten, die in Ihrer Anwendung in Ihren Manifestdateien angezeigt wird .
quelle
Absturz während der Entwicklung
Probieren Sie meine bevorzugte Tool- Protokollansicht aus , um die Protokolle abzurufen und während der Entwicklung zu analysieren.
Achten Sie darauf , zu kennzeichnen
./logview
und./lib/logview.jar
als ausführbar , wenn unter Linux läuft.Wenn es Ihnen nicht gefällt, gibt es viele alternative Desktop-Protokoll-Viewer für Android .
Absturz in freier Wildbahn
Integrieren Sie ein Echtzeit-Crash-Reporting-Tool wie Firebase Crashlytics , um Stapelspuren nicht behandelter Ausnahmen zu erhalten, die auf den Geräten der Benutzer aufgetreten sind.
Lesen Sie, wie Sie eine Buggy-App veröffentlichen (und leben, um die Geschichte zu erzählen) , um mehr über den Umgang mit Fehlern vor Ort zu erfahren.
quelle
Die Leute machen Fehler und damit auch das Codieren.
Wenn jemals etwas
error
passiert ist, wenden Sie sich immer an den Logcat mit dem Text in roter Farbe. Sie können jedoch das eigentliche Problem in blauem Text mit Unterstreichung in diesem roten Text herausfinden .Stellen Sie sicher, wenn Sie eine neue erstellen
activity
, deklarieren Sie immer dieactivity
in derAndroidManifest
Datei.Wenn Sie eine Berechtigung hinzufügen, deklarieren Sie diese ebenfalls in der
AndroidMainifest
Datei.quelle
Logcat - Zum Überprüfen der Protokolle in der Entwicklungsphase von Android Studio
Löschen Sie zunächst den Logcat und lassen Sie die App erneut abstürzen, damit Sie nur abgestürzte Protokolldetails erhalten. Sie müssen die Stapelverfolgung überprüfen
Häufiger Fehler beim Absturz der App wie:
So beheben Sie einen App-Absturzfehler:
quelle
Zuerst müssen Sie überprüfen, wo und warum Ihre App abgestürzt ist.
(Unfortunately, MyApp has stopped.).
Mithilfe vonLOG
können Sie herausfinden, was schief gelaufen ist.Danach finden Sie heraus, an welchem Punkt Ihre App aufgehört hat, dies von Ihrem Punkt aus zu beheben.
quelle
Wenn Sie in Ihrem Terminal kein interessantes Protokoll haben (oder diese nicht direkt mit Ihrer App zusammenhängen), liegt Ihr Problem möglicherweise an einer nativen Bibliothek. In diesem Fall sollten Sie in Ihrem Terminal nach "Tombstone" -Dateien suchen.
Der Standardspeicherort für die Tombstone-Dateien hängt von jedem Gerät ab. In diesem Fall wird jedoch in einem Protokoll Folgendes angegeben:
Tombstone written to: /data/tombstones/tombstone_06
Weitere Informationen finden Sie unter https://source.android.com/devices/tech/debug .
quelle
Auch das Ausführen dieses Befehls im Terminal kann helfen, das Problem zu finden:
gradlew build > log.txt 2>details.txt
Dann sollten Sie zum Speicherort der gradlew-Datei in den beiden oben genannten Protokolldateien gehen.
quelle