java gui Leider hat MyApp gestoppt. Wie kann ich das lösen?




jpanel (12)

Wenn deine App aus irgendeinem Grund ohne guten Stacktrace abstürzt. Versuchen Sie, es aus der ersten Zeile zu debuggen, und gehen Sie Zeile für Zeile bis zum Absturz. Dann haben Sie eine Antwort, welche Zeile Ihnen Probleme bereitet. Wahrscheinlich könnten Sie es dann in try catch block und print error output einbinden.

Ich entwickle eine Anwendung, und jedes Mal, wenn ich sie benutze, bekomme ich die Nachricht:

Leider hat MyApp gestoppt.

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

Über diese Frage - offensichtlich inspiriert von Was ist ein Stack-Trace, und wie kann ich es verwenden, um meine Anwendungsfehler zu debuggen? Es gibt viele Fragen, die besagen, dass ihre Anwendung ohne weitere Details abgestürzt ist. Diese Frage zielt darauf ab, unerfahrene Android-Programmierer anzuleiten, wie sie versuchen, ihre Probleme selbst zu lösen oder die richtigen Fragen zu stellen.


Diese Antwort beschreibt das Abrufen des Stack-Trace. Hast du schon den Stack-Trace? Lesen Sie Stack-Traces in " Was ist ein Stack-Trace und wie kann ich ihn zum Debuggen von Anwendungsfehlern verwenden? "

Das Problem

Ihre Anwendung wurde beendet, weil eine nicht RuntimeException ausgelöst wurde.
Am häufigsten ist die NullPointerException .

Wie man es löst?

Jedes Mal, wenn eine Android-Anwendung abstürzt (oder eine andere 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

Klicken Sie in der unteren Leiste des Fensters auf die Schaltfläche Logcat . Alternativ können Sie Alt + 6 drücken. Stellen Sie sicher, dass Ihr Emulator oder Gerät im Gerätebedienfeld ausgewählt ist. Versuchen Sie als nächstes, die Stack-Kurve zu finden, die rot angezeigt wird. Es kann eine Menge Dinge in logcat protokolliert werden, so dass Sie möglicherweise ein wenig scrollen müssen. Eine einfache Möglichkeit, 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 die Stack-Spur 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 die Stack-Trace analysieren.

Lesen Sie Stack-Traces in " Was ist ein Stack-Trace und wie kann ich ihn zum Debuggen von Anwendungsfehlern verwenden? "

Ich kann mein Problem immer noch nicht lösen!

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

Versuchen Sie, so knapp wie möglich zu sein: Veröffentlichen Sie die Stapelverfolgung und den entsprechenden Code (z. B. ein paar Zeilen bis zu der Zeile, die die Exception ).


Lassen Sie mich eine grundlegende Logcat-Analyse für den Fall teilen, dass Sie einen Force Close (wenn die App nicht mehr funktioniert) treffen.

DOCS

Basiswerkzeug von Android zum Sammeln / Analysieren von Logs ist der Logcat.

HERE ist die Android Seite über logcat

Wenn Sie Android Studio verwenden, können Sie auch diesen LINK überprüfen.

Erfassen

Grundsätzlich können Sie logcat mit folgendem Befehl MANUELL erfassen (oder prüfen Sie einfach das AndroidMonitor-Fenster in AndroidStudio):

adb logcat

Es gibt eine Menge von Parametern, die Sie zum Befehl hinzufügen können, was Ihnen hilft, die gewünschte Nachricht zu filtern und anzuzeigen ... Das ist persönlich ... Ich benutze immer den folgenden Befehl, um den Zeitstempel der Nachricht zu erhalten:

adb logcat -v time

Sie können die Ausgabe in eine Datei umleiten und in einem Texteditor analysieren.

Analysieren

Wenn Ihre App "Crashing" ist, 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:

  • Wenn das Problem passierte: 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 sicherstellen, dass Sie die richtigen Nachrichten überprüfen :)

  • Welche App ist abgestürzt: com.example.khan.abc

Auf diese Weise wissen Sie, welche App abgestürzt ist (um sicherzustellen, dass Sie die Logs auf Ihre Nachricht überprüfen)

  • Welcher FEHLER: java.lang.NullPointerException

Ein NULL-Zeiger-Ausnahmefehler

  • Detaillierte Informationen zu dem 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 onBackPressed() . Dieses Objekt war jedoch null als Sie es getan haben.

  • Stack Trace: Stack Trace zeigt Ihnen die Aufrufreihenfolge der Methoden ... Manchmal passiert der Fehler in der aufrufenden Methode (und nicht in der aufgerufenen Methode).

    bei com.example.khan.abc.AudioFragment $ 1.onClick (AudioFragment.java:125)

Fehler in der Datei com.example.khan.abc.AudioFragment.java , in der onClick() -Methode bei Zeile: 125 (Stacktrace zeigt die Zeile an, in der der Fehler onClick() 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)

Das wurde aufgerufen von:

at android.os.Handler.handleCallback(Handler.java:815)

etc....

Überblick

Dies war nur ein Überblick ... Nicht alle Protokolle sind einfach usw. Es ist nur um die Idee zu teilen und Ihnen eine Einstiegsinformation zu geben ...

Ich hoffe, ich könnte dir irgendwie helfen ... Grüße


Sie können eines dieser Tools verwenden:

  1. adb logcat

  2. adb logcat> logs.txt (Sie können Editoren zum Öffnen und Suchen von Fehlern verwenden.)

  3. Eclipse Logcat (Wenn nicht in Eclipse sichtbar, Gehe zu Windows-> Show View-> Andere-> Android-> LogCat)

  4. Android Debug Monitor oder Android Device Monitor (Befehlsmonitor eingeben oder über die Benutzeroberfläche öffnen)

  1. Android Studio

Ich schlage vor, Android Debug Monitor zu verwenden , es ist gut. Weil Eclipse hängt, wenn zu viele Protokolle da sind, und durch adb logcat Filter und alles schwierig.


Überprüfen Sie Ihre Logcat Nachricht und sehen Sie Ihre Manifest Datei. Es sollte etwas fehlen wie die Definition der Activity, Benutzerberechtigung usw.


Alternative Lösung für den Umgang mit App Absturz leider.

Wir erhalten diese Nachricht immer dann, wenn unsere App durch Ausnahmen geschlossen wurde , die nicht in Android oder in unserer Anwendung behandelt werden.

Also müssen wir uns nur darum kümmern, wenn wir den Code schreiben, der viel Zeit bei der Verfolgung aller Arten von Ausnahmen in Android spart.

Schritte zum Verfolgen der Ausnahmen in der App: -

1.Öffnen Sie das Logcat und sehen Sie sich die Exception an.

Wenn Sie die Logcat-Fenster nicht sehen können, gehen Sie zu diesem Pfad und öffnen Sie ihn

window->show view->others->Android->Logcat 

Wir benutzen den LogCat und versuchen herauszufinden, was die App zum Absturz bringt.

2. Versuchen Sie, die Ausnahme zu behandeln, die im logcat angezeigt wird, und überprüfen Sie auch die anderen Fälle, die die Ausnahme verursachen können.

3. Fügen Sie in Ihrer Anwendung einen Uncaught Exception Handler hinzu, um alle anderen Ausnahmen zu speichern.

I) .Erstellen Sie eine Klasse MyExceptionHandler, die thread.UncaughtExceptionHandler implementiert

public class MyExceptionHandler implements
    Thread.UncaughtExceptionHandler {
private final Context myContext;
private final Class<?> myActivityClass;

public MyExceptionHandler(Context context, Class<?> c) {

    myContext = context;
    myActivityClass = c;
}

public void uncaughtException(Thread thread, Throwable exception) {
    StringWriter stackTrace = new StringWriter();
    exception.printStackTrace(new PrintWriter(stackTrace));
    System.err.println(stackTrace);
    // You can use LogCat too
    Intent intent = new Intent(myContext, myActivityClass);
    intent.putExtra("uncaughtException", "Exception : " + stackTrace.toString());
    intent.putExtra("stacktrace", s);
    myContext.startActivity(intent);
    //for restarting the Activity
    Process.killProcess(Process.myPid());
    System.exit(0);
}

}

II) .Handle-Ausnahme in jeder Klasse oder Aktivität oder Fragment.

//We need to Caught the Unwanted exception whihc is not handled by Android:
  Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler(this, SplashScreen.class));

Es wird die gleiche Aktivität erneut starten, wenn die App abgestürzt ist.


Zuerst prüfen Sie, an welchem ​​Punkt Ihre App abgestürzt ist ( Unfortunately, MyApp has stopped. ). Dazu können Sie Log.e("TAG","Message"); Mit dieser Zeile können Sie Ihre Anmeldung in logcat sehen.

Danach findest du heraus, welchen Punkt deine App gestoppt hat. Es ist sehr einfach, sie an deiner Seite zu lösen.


In der Methode showToast () müssen Sie einen anderen Parameter für Kontext oder Anwendungskontext übergeben, damit Sie es ausprobieren können.

  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();
}

Überprüfen Sie einfach den Fehler in log cat.

Sie erhalten die Option log cat von in eclipse:

Fenster-> Zeige Ansicht-> Andere-> Android-> Logcat

Logcat enthält einen Fehler.

Sie können den Fehler auch überprüfen, indem Sie eine Anwendung im Debug-Modus ausführen. Setzen Sie zuerst den Haltepunkt, indem Sie Folgendes tun:

Rechtsklick auf Projekt-> Debug as-> Android-Anwendung


Sie können das ADB-Tool von Google verwenden , um eine Logcat file zur Analyse des Problems zu erhalten.

adb logcat > logcat.txt

Öffnen logcat.txt Datei logcat.txt und suchen Sie nach Ihrem Anwendungsnamen. Es sollte Informationen darüber geben, warum es fehlgeschlagen ist, die Zeilennummer, der Klassenname usw.


Hinweis: Diese Antwort verwendet Android Studio 2.2.2

Hinweis 2: Ich denke, dass Ihr Gerät erfolgreich verbunden ist.

Das erste, was Sie tun, wenn Ihre Anwendung abstürzt, ist ein Blick in das LogCat. Unten in 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 bekommst du so etwas:

Ändern Sie " Verbose " in " Error " Jetzt werden nur die protokollierten Fehler Verbose . Mach dir keine Sorgen über all diese Fehler (wenn du sie hast) jetzt.

OK. Mach jetzt, was du getan hast, um deine App zum Absturz zu bringen. Wenn deine App abstürzt, gehe zu deinem Logcat. Sie sollten ein neues Caused by: TrumpIsPresidentException finden, das eine Menge von at:xxx : und Caused by: TrumpIsPresidentException zum Beispiel hat. Gehen Sie zu der Anweisung Caused by: in Ihrem Logcat.

Caused By: sollte die Ausnahme sein, die passiert ist. In meinem Fall ist es eine RuntimeException und darunter sollte es eine Zeile geben, die einen blauen Link enthält wie:

Wenn das Caused by: hat keine Zeile mit einem blauen Text irgendwo darunter, dann suchen Sie nach einem anderen Caused by: das tut.

Klicke auf diesen blauen Link . Es sollte Sie dorthin bringen, wo das Problem aufgetreten ist. In meinem Fall war es wegen dieser Linie:

throw new RuntimeException();

Also, jetzt weiß ich, warum es zusammenbricht. Es ist, weil ich die Ausnahme selbst schmeiße. Das war ein offensichtlicher Fehler .

Nehmen wir an, ich habe einen anderen Fehler:

java.lang.NullPointerException

Ich überprüfte meinen Logcat, ich klickte auf den blauen Link, den er mir gab, und es brachte mich hierher:

mTextView.setText(myString);

So, jetzt möchte ich debuggen. Gemäß NullPointerException sagt eine NullPointerException, dass etwas null .

Also, lasst uns herausfinden, was null ist . Es gibt zwei Möglichkeiten. Entweder ist mTextView null oder myString ist null. Um herauszufinden, vor der mTextView.setText(mString) Zeile, füge ich diese zwei Zeilen hinzu:

Log.d("AppDebug","mTextView is null: " + String.valueOf(mTextView == null);
Log.d("AppDebug","myString is null: " + String.valueOf(myString== null);

Jetzt, wie wir es zuvor getan haben (Wir haben Verose in Error geändert), wollen wir "Error" in "Debug" ändern. Da wir uns beim Debuggen anmelden. Hier sind alle Log-Methoden:

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

Also, da wir Log.d verwendet Log.d , überprüfen wir Debug. Deshalb haben wir es in Debug geändert.

Hinweis Log.d hat einen ersten Parameter, 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 in "Log-Tag" "App-Debug". OK klicken". Jetzt sollten Sie zwei Zeilen im Logcat sehen:

yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false

Nun wissen wir, dass mTextView null ist.

Ich beobachte meinen Code, jetzt merke ich etwas.

Ich habe private TextView mTextView am Anfang meiner Klasse deklariert. Aber ich definiere es nicht.

Im Grunde habe ich vergessen, dies in meinem onCreate () zu tun:

mTextView = (TextView) findViewById(R.id.textview_id_in_xml);

Deshalb ist mTextView 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.


Dieses Popup wird nur angezeigt, wenn Sie eine schwerwiegende Ausnahme in Ihrem Code erhalten, die die Ausführung der App stoppt. Es könnte eine beliebige Ausnahme sein: NullPointerException, OutOfMemoryException usw.

Der beste Weg, um zu überprüfen ist über Logcat, wenn Sie noch die App in Android Studio entwickeln, die schnelle Möglichkeit ist, Stack-Trace zu lesen und die Ursache der App zu überprüfen.

Wenn Ihre App bereits live ist, können Sie logcat nicht verwenden. Daher können Sie Crashlytics implementieren, um Ihnen Fehlerberichte über alle auftretenden Ausnahmebedingungen zur Verfügung zu stellen.





android