Leider hat MyApp aufgehört. Wie kann ich das lösen?
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 soll unerfahrene Android-Programmierer darin 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 im Devices
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
).
Sie können das ADB-Tool von Google verwenden , um Logcat file
das Problem zu analysieren.
adb logcat > logcat.txt
Ö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.
Zuerst überprüfen Sie, an welchem Punkt Ihre App abgestürzt ist ( Unfortunately, MyApp has stopped.
). Hierfür können Sie Log.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.
Überprüfen Sie einfach den Fehler in log cat.
Sie erhalten die Option log cat von in Eclipse:
Fenster-> Ansicht anzeigen-> Andere-> Android-> Logcat
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:
Klicken Sie mit der rechten Maustaste auf Projekt-> Debuggen als-> Android-Anwendung
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, führe meine App aus und jetzt stürzt die App nicht ab.
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 .
Überprüfen Sie Ihre Logcat
Nachricht und sehen Sie Ihre Manifest
Datei. Es sollte etwas fehlen, wie das Definieren der Activity,
Benutzerberechtigung usw.
Sie können eines dieser Tools verwenden:
adb logcat
adb logcat> logs.txt (Sie können Editoren verwenden, um Fehler zu öffnen und zu suchen.)
eclipse logcat (Wenn in eclipse nicht sichtbar, gehen Sie zu Windows-> Ansicht anzeigen-> Andere-> Android-> LogCat)
Android Debug Monitor oder Android Device Monitor (Befehlsmonitor eingeben oder über die Benutzeroberfläche öffnen)
- Android Studio
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.
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
window->show view->others->Android->Logcat
Wenn Sie Google-Api verwenden, gehen Sie zu diesem Pfad
adb logcat> logcat.txt
In der folgenden showToast () -Methode müssen Sie einen anderen Parameter für den Kontext oder den Anwendungskontext übergeben, indem Sie dies versuchen.
public void showToast(String error, Context applicationContext){
LayoutInflater inflater = getLayoutInflater();
View view = inflater.inflate(R.layout.custom_toast, (ViewGroup)
findViewById(R.id.toast_root));
TextView text = (TextView) findViewById(R.id.toast_error);
text.setText(error);
Toast toast = new Toast(applicationContext);
toast.setGravity(Gravity.TOP | Gravity.FILL_HORIZONTAL, 0, 0);
toast.setDuration(Toast.LENGTH_SHORT);
toast.setView(view);
toast.show();
}
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):
adb logcat
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:
adb logcat -v time
Sie können die Ausgabe in eine Datei umleiten und in einem Texteditor analysieren.
Analysieren
Wenn Ihre App abstürzt, erhalten Sie Folgendes:
07-09 08:29:13.474 21144-21144/com.example.khan.abc D/AndroidRuntime: Shutting down VM
07-09 08:29:13.475 21144-21144/com.example.khan.abc E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.khan.abc, PID: 21144
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference
at com.example.khan.abc.AudioFragment$1.onClick(AudioFragment.java:125)
at android.view.View.performClick(View.java:4848)
at android.view.View$PerformClick.run(View.java:20262)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5631)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
07-09 08:29:15.195 21144-21144/com.example.khan.abc I/Process: Sending signal. PID: 21144 SIG: 9
Dieser Teil des Protokolls zeigt Ihnen viele Informationen:
- Als das Problem auftrat:
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 :)
- Welche App ist abgestürzt:
com.example.khan.abc
Auf diese Weise wissen Sie, welche App abgestürzt ist (um sicherzugehen, dass Sie die Protokolle Ihrer Nachricht überprüfen).
- Welcher FEHLER:
java.lang.NullPointerException
Ein NULL-Zeiger-Ausnahmefehler
- Detaillierte Informationen zum Fehler:
Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference
Sie haben versucht, die Methode onBackPressed()
von einem FragmentActivity
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 der onClick()
Methode in Zeile: 125
(Stacktrace zeigt die Zeile, in der der Fehler aufgetreten ist)
Es wurde aufgerufen von:
at android.view.View.performClick(View.java:4848)
Welches wurde aufgerufen von:
at android.view.View$PerformClick.run(View.java:20262)
welches aufgerufen wurde von:
at android.os.Handler.handleCallback(Handler.java:815)
etc....
Überblick
Dies war nur eine Übersicht ... Nicht alle Protokolle sind einfach, aber der Fehler gibt ein spezifisches Problem und ausführlich zeigt alle Probleme ... Es dient nur dazu, die Idee zu teilen und Ihnen Informationen für Einsteiger bereitzustellen ...
Ich hoffe ich konnte dir irgendwie helfen ... Grüße
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.
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 und print error output einbinden.
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 des Zusammenführens 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 .
Absturz während der Entwicklung
Probieren Sie meine Lieblingswerkzeug- 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 abzurufen, 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.
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 die activity
in der AndroidManifest
Datei.
Wenn Sie eine Berechtigung hinzufügen, deklarieren Sie diese ebenfalls in der AndroidMainifest
Datei.
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 den Stack-Trace überprüfen
Leider hat MyApp aufgehört. Dafür gibt es viele Gründe. Sie können dies auch in Protokollen überprüfen. Hierfür können Sie Log.e ("TAG", "Message") verwenden;
Häufiger Fehler beim Absturz der App wie:
- Codierungsfehler (falsche Verwendung von Schlüsselwörtern).
- Name der Eigenschaft stimmt nicht überein.
- Nicht unterstütztes Plugin (vielleicht).
- Nicht übereinstimmende Version (vielleicht).
- Aktivität fehlt in AndroidManifest-Datei.
- Berechtigung fehlt in AndroidManifest-Datei.
- Häufigste NullPointerException.
- Deklariert, aber nicht definiert.
So beheben Sie einen App-Absturzfehler:
- Beachten Sie die obigen Punkte und gehen Sie sie durch.
- Mit dem Fehler erhalten Sie den Dateinamen auch in blauer Farbe (klicken Sie darauf und springen Sie zum Code, wenn ein Fehler auftritt).
Zuerst müssen Sie überprüfen, wo und warum Ihre App abgestürzt ist. (Unfortunately, MyApp has stopped.).
Mithilfe von LOG
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.
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. Wenn dies jedoch der Fall ist, wird in einem Protokoll Folgendes angegeben: Tombstone written to: /data/tombstones/tombstone_06
Weitere Informationen finden Sie unter https://source.android.com/devices/tech/debug .
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 gehen und zwei der oben genannten Protokolldateien lesen.