885 Stimmen

Leider ist MyApp abgestürzt. Wie kann ich das lösen?

Ich entwickle eine Anwendung, und jedes Mal, wenn ich sie ausführe, erhalte ich die Nachricht:

Leider wurde MyApp beendet.

Was kann ich tun, um das zu lösen?


Zu dieser Frage - offensichtlich inspiriert von Was ist ein Stack-Trace und wie kann ich ihn verwenden, um meine Anwendungsfehler zu debuggen?, gibt es viele Fragen, in denen angegeben wird, dass ihre Anwendung abgestürzt ist, ohne weitere Details. Diese Frage soll angehenden Android-Programmierern zeigen, wie sie versuchen können, ihre Probleme selbst zu lösen oder die richtigen Fragen zu stellen.

779voto

nhaarman Punkte 94842

Diese Antwort beschreibt den Prozess des Abrufens des Stack-Traces. Haben Sie bereits den Stack-Trace? Lesen Sie mehr über Stack-Traces in "Was ist ein Stack-Trace und wie kann ich ihn verwenden, um Fehler in meiner Anwendung zu debuggen?"

Das Problem

Ihre Anwendung wurde beendet, weil eine unbehandelte RuntimeException ausgelöst wurde.
Die häufigste davon ist die NullPointerException.

Wie löst man es?

Jedes Mal, wenn eine Android-Anwendung abstürzt (oder jede Java-Anwendung), wird ein Stack-Trace in die Konsole geschrieben (in diesem Fall logcat). Dieser Stack-Trace enthält wichtige Informationen zur Lösung Ihres Problems.

Android Studio

So finden Sie den Stack-Trace in Android Studio

Klicken Sie auf die untere Leiste des Fensters auf die Logcat-Schaltfläche. Alternativ können Sie Alt+6 drücken. Stellen Sie sicher, dass Ihr Emulator oder Gerät im Geräte-Panel ausgewählt ist. Versuchen Sie dann, den Stack-Trace zu finden, der in Rot angezeigt wird. Es kann viele Informationen in logcat protokolliert sein, so dass Sie möglicherweise ein wenig scrollen müssen. Ein einfacher Weg, den Stack-Trace zu finden, besteht darin, den logcat zu löschen (mit dem Papierkorb auf der rechten Seite) und die App erneut abstürzen zu lassen.

Ich habe den Stack-Trace gefunden, und jetzt?

Hurra! Sie sind auf halbem Weg, Ihr Problem zu lösen.
Sie müssen nur herausfinden, was genau dazu geführt hat, dass Ihre Anwendung abgestürzt ist, indem Sie den Stack-Trace analysieren.

Lesen Sie mehr über Stack-Traces in "Was ist ein Stack-Trace und wie kann ich ihn verwenden, um Fehler in meiner Anwendung zu debuggen?"

Ich kann mein Problem immer noch nicht lösen!

Wenn Sie Ihre Exception und die Zeile gefunden haben, an der sie aufgetreten ist, und immer noch nicht herausfinden können, wie Sie das Problem beheben können, zögern Sie nicht, eine Frage auf StackOverflow zu stellen.

Versuchen Sie, so präzise wie möglich zu sein: Veröffentlichen Sie den Stack-Trace und den relevanten Code (z. B. ein paar Zeilen bis zur Zeile, die die Exception ausgelöst hat).

132voto

Vlad Bezden Punkte 71128

Sie können das ADB-Tool von Google verwenden, um die Logcat-Datei zu erhalten und das Problem zu analysieren.

adb logcat > logcat.txt

Öffnen Sie die Datei logcat.txt und suchen Sie nach dem Namen Ihrer Anwendung. Dort sollten Informationen darüber stehen, warum es fehlgeschlagen ist, die Zeilennummer, Klassennamen usw.

45voto

Hiren Vaghela Punkte 916

Zuerst überprüfen Sie, an welcher Stelle Ihre App abgestürzt ist (Leider wurde MyApp beendet.). Dazu können Sie Log.e("TAG", "Nachricht"); verwenden. Mit dieser Zeile können Sie Ihr App-Protokoll im Logcat sehen.

Danach finden Sie heraus, an welcher Stelle Ihre App gestoppt wurde. Es ist sehr einfach, das Problem auf Ihrer Seite zu lösen.

36voto

Rahil Ali Punkte 919

Nur den Fehler im Logcat überprüfen.

Sie erhalten die Logcat-Option in Eclipse:

Fenster->Ansicht anzeigen->Weitere->Android->Logcat

Logcat enthält den Fehler.

Andernfalls können Sie den Fehler auch durch Ausführen einer Anwendung im Debug-Modus überprüfen. Legen Sie zunächst einen Haltepunkt fest, indem Sie folgendes tun:

Rechtsklick auf Projekt->Als Debuggen->Android-Anwendung

35voto

Ali Bdeir Punkte 4519

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:

Bild

Klicken Sie auf "Android Monitor" (Das, was ich im obigen Bild unterstrichen habe. ^)

Jetzt sehen Sie etwas Ähnliches wie dies:

Bild

Ä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).

Bild

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.

Bild

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:

Bild

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.


CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X