Purtroppo MyApp si è fermata. Come posso risolvere questo?
Sto sviluppando un'applicazione e ogni volta che la eseguo ricevo il messaggio:
Sfortunatamente, MyApp si è interrotta.
Cosa posso fare per risolvere questo problema?
A proposito di questa domanda, ovviamente ispirata a Che cos'è una traccia dello stack e come posso utilizzarla per eseguire il debug degli errori dell'applicazione? , ci sono molte domande che affermano che la loro applicazione è andata in crash, senza ulteriori dettagli. Questa domanda ha lo scopo di istruire i programmatori Android inesperti su come provare a risolvere i propri problemi da soli o porre le domande giuste.
Risposte
Questa risposta descrive il processo di recupero della traccia dello stack. Hai già la traccia dello stack? Leggere le analisi dello stack in " Che cos'è un'analisi dello stack e come posso utilizzarla per eseguire il debug degli errori dell'applicazione? "
Il problema
La tua applicazione si è chiusa perché è RuntimeException
stato lanciato un messaggio non rilevato .
Il più comune di questi è il NullPointerException
.
Come risolverlo?
Ogni volta che un'applicazione Android si arresta in modo anomalo (o qualsiasi applicazione Java per quella materia), Stack trace
viene scritto a sulla console (in questo caso, logcat). Questa analisi dello stack contiene informazioni vitali per risolvere il problema.
Android Studio
Nella barra inferiore della finestra, fare clic sul Logcat
pulsante. In alternativa, puoi premere alt+ 6. Assicurati che il tuo emulatore o dispositivo sia selezionato nel Devices
pannello. Quindi, prova a trovare la traccia dello stack, che è mostrata in rosso. Potrebbero esserci molte cose registrate in logcat, quindi potrebbe essere necessario scorrere un po '. Un modo semplice per trovare la traccia dello stack è cancellare il logcat (utilizzando il cestino a destra) e lasciare che l'app si blocchi di nuovo.
Ho trovato la traccia dello stack, e adesso?
Sìì! Sei a metà strada per risolvere il tuo problema.
Hai solo bisogno di scoprire cosa ha causato esattamente il crash dell'applicazione, analizzando la traccia dello stack.
Leggere le analisi dello stack in " Che cos'è un'analisi dello stack e come posso utilizzarla per eseguire il debug degli errori dell'applicazione? "
Non riesco ancora a risolvere il mio problema!
Se hai trovato il tuo Exception
e la riga in cui si è verificato, e ancora non riesci a capire come risolverlo, non esitare a fare una domanda su StackOverflow.
Cerca di essere il più conciso possibile: inserisci la traccia dello stack e il codice pertinente (ad esempio, poche righe fino alla riga che ha lanciato il Exception
).
È possibile utilizzare strumento di ADB di Google per arrivare Logcat file
ad analizzare la questione.
adb logcat > logcat.txt
apri il logcat.txt
file e cerca il nome dell'applicazione. Dovrebbero esserci informazioni sul motivo per cui non è riuscito, il numero di riga, il nome della classe, ecc.
Innanzitutto, controlla in quale punto la tua app è andata in crash ( Unfortunately, MyApp has stopped.
). Per questo, puoi usare Log.e("TAG", "Message");
, usando questa linea puoi vedere la tua app in logcat.
Dopodiché, scopri il punto in cui la tua app si è fermata è molto facile da risolvere al tuo fianco.
Basta controllare l'errore nel log cat.
Ottieni l'opzione log cat da in eclipse:
finestra-> mostra vista-> altri-> Android-> Logcat
Log cat contiene un errore.
Altrimenti puoi anche controllare l'errore eseguendo un'applicazione in modalità debug. In primo luogo impostare il punto di interruzione dopo di che facendo:
fare clic con il tasto destro su progetto-> debug come-> applicazione Android
Nota: questa risposta utilizza Android Studio 2.2.2
Nota 2: sto considerando che il tuo dispositivo è connesso correttamente.
La prima cosa che fai quando la tua applicazione si arresta in modo anomalo è guardare nel LogCat, nella parte inferiore di Android Studio c'è una barra degli strumenti con un elenco di menu:
Fare clic sul "Monitor Android" (quello che ho sottolineato nell'immagine sopra. ^)
Ora otterrai qualcosa del genere:
Cambia " Verbose
" in " Error
" Ora mostrerà solo gli errori registrati. Non preoccuparti di tutti questi errori (se li hai) ora.
Ok. Ora, fai quello che hai fatto per bloccare la tua app. Dopo che la tua app si arresta in modo anomalo, vai al tuo logcat. Dovresti trovare un nuovo registro di arresto anomalo che contiene molti at:x.x.x
: e Caused by: TrumpIsPresidentException
per esempio. Vai a quella Caused by:
dichiarazione nel tuo logcat.
Accanto a ciò Caused By:
, dovrebbe esserci l'eccezione che è accaduta. Nel mio caso, è una RuntimeException
e sotto dovrebbe esserci una riga che contiene un collegamento blu come:
SeCaused by:
NON ha una riga con un testo blu da qualche parte sotto, cercane un'altra Caused by:
che lo faccia.
Fare clic su quel collegamento blu . Dovrebbe portarti dove si è verificato il problema. Nel mio caso, era dovuto a questa linea:
throw new RuntimeException();
Quindi, ora so perché si sta bloccando. È perché sto lanciando l'eccezione io stesso. Questo è stato un errore evidente .
Tuttavia, diciamo che ho ricevuto un altro errore:
java.lang.NullPointerException
Ho controllato il mio logcat, ho fatto clic sul collegamento blu che mi ha fornito e mi ha portato qui:
mTextView.setText(myString);
Quindi, ora voglio eseguire il debug. Secondo questa domanda StackOverflow , una NullPointerException dice che qualcosa è null
.
Quindi, scopriamo cosa è nullo . Ci sono due possibilità. O mTextView
è nullo o myString
è nullo. Per scoprirlo, prima della mTextView.setText(mString)
riga, aggiungo queste due righe:
Log.d("AppDebug","mTextView is null: " + String.valueOf(mTextView == null);
Log.d("AppDebug","myString is null: " + String.valueOf(myString== null);
Ora, come abbiamo fatto in precedenza (abbiamo cambiato Verose in Error), vogliamo cambiare "Error" in "Debug". Dal momento che stiamo registrando tramite il debug. Ecco tutti i metodi di registro:
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
Quindi, da quando abbiamo usato Log.d
, stiamo controllando Debug. Ecco perché l'abbiamo modificato per eseguire il debug.
L'avviso Log.d
ha un primo parametro, nel nostro caso "AppDebug". Fare clic sul menu a discesa "Nessun filtro" in alto a destra del logcat. Seleziona "Modifica configurazione filtro", dai un nome al tuo filtro e in "Tag di log" metti "Debug app". Fare clic su "OK". Ora dovresti vedere due righe nel logcat:
yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false
Quindi ora sappiamo che mTextView è nullo.
Osservo il mio codice, ora noto qualcosa.
Mi sono private TextView mTextView
dichiarato al primo posto della mia classe. Ma non lo sto definendo.
Fondamentalmente mi sono dimenticato di farlo nel mio onCreate ():
mTextView = (TextView) findViewById(R.id.textview_id_in_xml);
Ecco perché mTextView
è nullo, perché ho dimenticato di dire alla mia app di cosa si tratta. Quindi aggiungo quella riga, eseguo la mia app e ora l'app non si blocca.
Questo popup viene visualizzato solo quando si ottiene un'eccezione irreversibile nel codice che interrompe l'esecuzione dell'app. Potrebbe essere un'eccezione NullPointerException
, OutOfMemoryException
ecc.
Il modo migliore per controllare è tramite Logcat se stai ancora sviluppando l'app in Android Studio, che è un modo rapido per leggere la traccia dello stack e verificare la causa dell'app.
Se la tua app è già attiva, non puoi usare logcat . Quindi, per questo puoi implementare Crashlytics
per fornire segnalazioni di bug di qualsiasi eccezione che si verifica.
Controlla il tuo Logcat
messaggio e guarda il tuo Manifest
file. Dovrebbe mancare qualcosa come la definizione Activity,
dell'autorizzazione dell'utente`, ecc.
Puoi utilizzare uno qualsiasi di questi strumenti:
adb logcat
adb logcat> logs.txt (puoi usare gli editor per aprire e cercare gli errori.)
eclipse logcat (Se non è visibile in eclipse, vai su Windows-> Mostra vista-> Altri-> Android-> LogCat)
Android Debug Monitor o Android Device Monitor (digita command monitor o apri tramite UI)
- Android Studio
Suggerisco di utilizzare Android Debug Monitor , va bene. Perché eclipse si blocca quando ci sono troppi registri e attraverso il filtro adb logcat e tutto difficile.
Devi controllare il file Stack trace
Come farlo?
sul tuo IDE Controlla il modulo di Windows LOGCAT
Se non riesci a vedere le finestre di logcat, vai in questo percorso e aprilo
window->show view->others->Android->Logcat
se stai usando Google-Api, segui questo percorso
adb logcat> logcat.txt
Nel metodo showToast () sotto devi passare un altro parametro per il contesto o il contesto dell'applicazione, così puoi provarlo.
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();
}
Permettimi di condividere un'analisi di Logcat di base per quando incontri una chiusura forzata (quando l'app smette di funzionare).
DOCS
Lo strumento di base di Android per raccogliere / analizzare i log è il logcat.
QUI è la pagina di Android su logcat
Se utilizzi Android Studio, puoi anche controllare questo LINK .
Catturare
Fondamentalmente, puoi catturare MANUALMENTE logcat con il seguente comando (o semplicemente controllare la finestra AndroidMonitor in AndroidStudio):
adb logcat
Ci sono molti parametri che puoi aggiungere al comando che ti aiutano a filtrare e visualizzare il messaggio che desideri ... Questo è personale ... Uso sempre il comando seguente per ottenere il timestamp del messaggio:
adb logcat -v time
È possibile reindirizzare l'output a un file e analizzarlo in un editor di testo.
Analizzando
Se la tua app si blocca, otterrai qualcosa del tipo:
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
Questa parte del registro mostra molte informazioni:
- Quando si è verificato il problema:
07-09 08:29:13.475
È importante controllare quando si è verificato il problema ... Potresti trovare diversi errori in un registro ... devi essere sicuro di controllare i messaggi corretti :)
- Quale app si è bloccata:
com.example.khan.abc
In questo modo, sai quale app si è arrestata in modo anomalo (per essere sicuro di controllare i log del tuo messaggio)
- Quale ERRORE:
java.lang.NullPointerException
Errore di eccezione del puntatore NULL
- Informazioni dettagliate sull'errore:
Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference
Hai provato a chiamare il metodo onBackPressed()
da un FragmentActivity
oggetto. Tuttavia, quell'oggetto era null
quando l'hai fatto.
Stack Trace: Stack Trace mostra l'ordine di chiamata del metodo ... A volte, l'errore si verifica nel metodo chiamante (e non nel metodo chiamato).
su com.example.khan.abc.AudioFragment $ 1.onClick (AudioFragment.java:125)
Si è verificato un errore nel file com.example.khan.abc.AudioFragment.java
, all'interno del onClick()
metodo alla riga: 125
(stacktrace mostra la riga in cui si è verificato l'errore)
È stato chiamato da:
at android.view.View.performClick(View.java:4848)
Che è stato chiamato da:
at android.view.View$PerformClick.run(View.java:20262)
che è stato chiamato da:
at android.os.Handler.handleCallback(Handler.java:815)
eccetera....
Panoramica
Questa era solo una panoramica ... Non tutti i registri sono semplici ma l'errore fornisce un problema specifico e dettagliatamente mostra tutti i problemi ... Serve solo per condividere l'idea e fornire informazioni di livello base ...
Spero di poterti aiutare in qualche modo ... Saluti
Usa LogCat e prova a trovare la causa dell'arresto anomalo dell'app.
Per vedere Logcat se usi Android Studio, premi ALT + 6 o
se usi Eclipse, allora Finestra -> Apri prospettiva -> Altro - LogCat
Vai a LogCat, dal menu a discesa seleziona errore. Questo conterrà tutte le informazioni richieste per aiutarti a eseguire il debug. Se ciò non aiuta, pubblica LogCat come modifica alla tua domanda e qualcuno ti aiuterà.
Se la tua app per qualche motivo si arresta in modo anomalo senza un buon stacktrace. Prova a eseguire il debug dalla prima riga e vai riga per riga fino al crash. Quindi avrai una risposta, quale linea ti sta causando problemi. Probabilmente potresti quindi includerlo in try catch block e print error output.
È inoltre possibile ottenere questo messaggio di errore da solo, senza alcuna traccia dello stack o ulteriori messaggi di errore.
In questo caso è necessario assicurarsi che il manifest di Android sia configurato correttamente (inclusa qualsiasi unione di manifest che si verifica da una libreria e qualsiasi attività che proviene da una libreria) e prestare particolare attenzione alla prima attività visualizzata nell'applicazione nei file manifest .
Crash durante lo sviluppo
Prova il mio strumento logview preferito per ottenere i log e analizzarli durante lo sviluppo.
Assicurati di contrassegnare ./logview
e ./lib/logview.jar
come eseguibile durante l'esecuzione in Linux.
Se non ti piace, ci sono molti visualizzatori di log desktop alternativi per Android .
Crash in the wild
Integra uno strumento di segnalazione degli arresti anomali in tempo reale come Firebase Crashlytics per ottenere stacktrace di eccezioni non gestite che si sono verificate sui dispositivi degli utenti.
Leggi Come rilasciare un'app buggy (e vivere per raccontare la storia) per saperne di più sulla gestione dei bug sul campo.
Le persone commettono errori e quindi anche la codifica.
Quando mai error
accaduto, controlla sempre con il logcat con il testo in colore rosso, tuttavia puoi scoprire il vero problema nel testo di colore blu con sottolineato in quel testo di colore rosso.
Assicurati che se ne crei uno nuovo activity
, dichiara sempre activity
il AndroidManifest
file nel file.
Se si aggiunge l'autorizzazione, dichiararla anche nel AndroidMainifest
file.
Logcat - Per controllare i log nella fase di sviluppo di Android Studio
Inizialmente cancella Logcat e lascia che l'app si arresti di nuovo in modo da poter ottenere solo i dettagli del registro arrestati. Devi controllare la traccia dello Stack
Mentre, purtroppo, MyApp si è fermata. Ci sono molte ragioni per questo. Puoi controllare lo stesso nei log. Per questo, puoi usare Log.e ("TAG", "Message");
Errore comune durante l'arresto anomalo dell'app come:
- Errore di codifica (uso errato delle parole chiave).
- Nome proprietà non corrispondente.
- Plugin non supportato (forse).
- Versione non corrispondente (forse).
- Attività mancante nel file AndroidManifest.
- Autorizzazione mancante nel file AndroidManifest.
- NullPointerException più comune.
- Dichiarato ma non definito.
Per risolvere l'errore di arresto anomalo dell'app:
- Tieni a mente i punti precedenti e analizzali.
- Con l'errore, otterrai il nome del file anche in colore blu (fai clic su di essi e salta al codice da errore si verifica).
Per prima cosa, devi controllare dove e perché la tua app è andata in crash (Unfortunately, MyApp has stopped.).
Con l'aiuto di LOG
, puoi capire cosa è andato storto.
Dopodiché, scopri il punto in cui la tua app ha smesso di risolverlo dal tuo punto.
Se non hai alcun tipo di log interessante nel tuo terminale (o non sono direttamente correlati alla tua app), forse il tuo problema è dovuto a una libreria nativa. In tal caso, dovresti controllare i file "tombstone" nel tuo terminale.
La posizione predefinita per i file tombstone dipende da ogni dispositivo, ma in tal caso, avrai un registro che dice: Tombstone written to: /data/tombstones/tombstone_06
Per ulteriori informazioni, controlla su https://source.android.com/devices/tech/debug .
Anche l'esecuzione di questo comando nel terminale può aiutare a trovare il problema:
gradlew build > log.txt 2>details.txt
quindi dovresti andare alla posizione del file gradlew in leggere due file di registro sopra.