java - gui - jpanel




Leider hat MyApp gestoppt. Wie kann ich das lösen? (10)

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.


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


Ü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


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

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 diese Fehlermeldung auch ohne Stack-Trace oder jede weitere Fehlermeldung erhalten.

In diesem Fall müssen Sie sicherstellen, dass Ihr Android-Manifest ordnungsgemäß konfiguriert ist (einschließlich Manifestzusammenführung aus einer Bibliothek und allen Aktivitäten, die aus einer Bibliothek stammen), und achten Sie besonders auf die erste Aktivität, die in Ihren Manifestdateien in Ihrer Anwendung angezeigt wird .


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.


Verwenden Sie den LogCat und versuchen Sie herauszufinden, was die App zum Absturz bringt.

Um Logcat zu sehen, wenn Sie Android Studio verwenden, drücken Sie ALT + 6 oder

Wenn Sie Eclipse verwenden, dann Fenster -> Perspektive öffnen -> Andere - LogCat

Gehen Sie zum LogCat, wählen Sie im Dropdown-Menü den Fehler aus. Dies enthält alle erforderlichen Informationen, um Ihnen beim Debuggen zu helfen. Wenn das nicht hilft, poste den LogCat als Editierung deiner Frage und jemand wird dir helfen.


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.


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


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.







android