Nota: questa risposta utilizza Android Studio 2.2.2
Nota 2: sto considerando che il dispositivo è stato collegato correttamente.
La prima cosa che fai quando l'applicazione si blocca è guardare LogCat, nella parte inferiore di Android Studio c'è una barra degli strumenti con un elenco di menu:
Fai clic su "Android Monitor" (Quello che ho sottolineato nell'immagine sopra. ^)
Ora otterrai qualcosa del genere:
Cambia " Verbose
" in " Error
" Ora ti mostrerà solo gli errori registrati. Non preoccuparti di tutti questi errori (se li hai) ora.
Ok. Ora fai quello che hai fatto per bloccare l'app. Dopo il crash dell'app, vai al tuo logcat. Dovresti trovare un nuovo registro degli arresti anomali che ha 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 si è verificata. Nel mio caso, è a RuntimeException
e sotto dovrebbe esserci una linea che contiene un collegamento blu come:
Se quelloCaused by:
NON ha una linea con un testo blu da qualche parte sotto di esso, quindi cercare un altro Caused by:
che lo fa.
Fai clic su quel link blu . Dovrebbe portarti dove si è verificato il problema. Nel mio caso, era dovuto a questa riga:
throw new RuntimeException();
Quindi, ora so perché si sta schiantando. È perché sto lanciando l'eccezione da solo. Questo è stato un errore evidente .
Tuttavia, supponiamo di avere un altro errore:
java.lang.NullPointerException
Ho controllato il mio logcat, ho cliccato sul link blu che mi ha dato e mi ha portato qui:
mTextView.setText(myString);
Quindi, ora voglio eseguire il debug. Secondo questa domanda StackOverflow , una NullPointerException dice che qualcosa lo è null
.
Quindi, scopriamo cosa è nullo . Ci sono due possibilità. O mTextView
è nullo o myString
è nullo. Per scoprire, 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, dal momento che abbiamo usato Log.d
, stiamo controllando Debug. Ecco perché l'abbiamo cambiato in 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 nel logcat. Selezionare "Modifica configurazione filtro", assegnare un nome al filtro e in "Tag registro" inserire "Debug app". Fai 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.
Ho private TextView mTextView
dichiarato ai vertici della mia classe. Ma non lo sto definendo.
Fondamentalmente ho dimenticato di farlo nel mio onCreate ():
mTextView = (TextView) findViewById(R.id.textview_id_in_xml);
Quindi, questo mTextView
è il motivo per cui è 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 arresta in modo anomalo.