Certo, la mia domanda è fondamentalmente lo stesso come questo, ma sembra essere stato lasciato senza risposta:Eclipse Android Debugger - Dove nel mio codice ho causato l'eccezione?
NullPointerException in handleStopActivity -- No reference to my code in stack trace
scaricato Eclipse Helios, strumenti di sviluppo Android Plugin, e il JDK tutto entro l'ultima settimana. Stavo scherzando con un'app sul mio dispositivo, l'ho eseguita in modalità debug e si è conclusa in modo imprevisto. Mi sono reso conto che avevo causato una NullPointerException e il problema in sé non era un problema per molto tempo.
Ciò che è un problema, tuttavia, è che il debugger non sembra in grado di identificare dove nel mio codice è stata generata l'eccezione. La traccia dello stack non fa riferimento al mio codice.
Anzi, se metto il seguente nel metodo OnCreate()
, ottengo lo stesso problema
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//lI("onCreate()"); //A silly logging thing I messed around with
Integer iDareYou = null;
iDareYou.byteValue();
Molto al suo attivo, Eclipse mi avverte di certo che il codice è probabile che esplodere in faccia. Ma quando ho eseguito questo sul mio dispositivo, l'analisi dello stack restituito è il seguente:
Thread [<1> main] (Suspended (exception RuntimeException))
ActivityThread.performLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2787
ActivityThread.handleLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2803
ActivityThread.access$2300(ActivityThread, ActivityThread$ActivityRecord, Intent) line: 135
ActivityThread$H.handleMessage(Message) line: 2136
ActivityThread$H(Handler).dispatchMessage(Message) line: 99
Looper.loop() line: 144
ActivityThread.main(String[]) line: 4937
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
Method.invoke(Object, Object...) line: 521
ZygoteInit$MethodAndArgsCaller.run() line: 868
ZygoteInit.main(String[]) line: 626
NativeStart.main(String[]) line: not available [native method]
Ho cercato in giro per alcune risposte e, purtroppo, tutto quello che potevo venire con erano domande del 'Perché il mio app Android causando una NullPointerException '? varietà.
Spero di scoprire cosa dovrei fare in modo diverso per essere in grado di trovare il punto nel mio codice in cui ho causato l'eccezione .... perché sono sicuro che questa capacità sarebbe utile a qualche punto in futuro!
Passare alla modifica per aggiungere alcune informazioni. Come cita il primo commento qui sotto, lo stato in cui il debugger sospende il thread non è lo stato 'finale' dell'applicazione. Premendo 'resume' un paio di volte si sposta il processo lungo il punto in cui il processo termina effettivamente, anche se sfortunatamente nessuna traccia di stack utile viene visualizzata nella finestra Debug di Eclipse/ADT. Tuttavia,, a questo punto la traccia dello stack ho incollato sopra seguito da le prime 3 linee univoche dello stack trace dell'NPE nel mio codice vengono emesse in LogCat. In precedenza avevo cercato di vedere se LogCat aveva qualcosa che potevo usare, ma molto probabilmente lo era prima che avessi premuto 'resume' nel debugger per spostare il processo in questo stato. Sfortunatamente, tuttavia, facendo in questo modo non viene mai visualizzata una traccia dello stack dell'NPE nel mio codice nel debugger effettivo.
Ma la notizia non è affatto male - dalle informazioni nella finestra 'Variabili' a destra, posso vedere che c'è un NPE nel campo di applicazione corrente del thread, in modo che almeno mi desse un indizio che un NPE sta succedendo (e ovviamente c'è LogCat).
Quindi, in base a un suggerimento su un argomento diverso, il miglior lavoro che ho trovato è quello di aggiungere un breakpoint "Caught and Uncaught" per NullPointerException. Quando eseguo questa operazione e rilancio, il debugger visualizza la traccia dello stack dell'NPE nel mio codice e sposta la finestra di modifica direttamente sulla riga in cui ho causato l'NPE.
Al momento credo che ciò sia dovuto al fatto che l'NPE viene catturato (e presumibilmente, nuovamente gettato) dal framework Android. Sembra che il dilemma originale sia stato causato dal fatto che la finestra Eclipse/ADT/DalvikVM Debug Stack Trace non include l'informazione "causata da" (per quanto posso dire) che viene visualizzata nella traccia stack "in seguito" visualizzata in LogCat.Analizzerò ulteriormente se questo possa essere risolto :)
Apprezzo il suggerimento di Bert F, poiché non ero pienamente consapevole del fatto che il thread non era ancora nel suo stato 'finale'. Anche se è vero che la traccia dello stack è [più tardi] visualizzata in LogCat, non l'ho "perso" in LogCat perché non era ancora [ancora] lì, quello che mi è mancato è stato il "resume" che avrebbe causato la traccia dello stack essere emesso in LogCat.
Anche se avevo preso il debugger di fermarsi alla linea nel mio codice utilizzando un punto di interruzione, c'è un caso per il fatto che ho potuto infine ottenuto l'analisi dello stack in LogCat dopo la ripresa del filo, che avrebbe in modo efficace problema risolto. L'unica altra cosa che potrei davvero chiedere sarebbe di avere il debugger fermo sulla linea nel mio codice che causa l'eccezione, invece di essere catturato e successivamente ri-gettato dal framework Android. Ma credo che sarebbe una domanda diversa :) E Eclipse, essendo utile così com'è, mi manderà lì se clicco sulla riga appropriata nella traccia dello stack visualizzata nella finestra LogCat.
Sembra che il programma sia stato sospeso nel debugger e che non abbia continuato a stampare l'eccezione e la traccia dello stack completo. Lasciare il programma continuare e quindi mostrare il messaggio di eccezione completo e lo stacktrace completo sarebbe utile. Spesso un NPE è avvolto da più eccezioni (la stampa "causata da" nella traccia dello stack) - il messaggio "causato da" più basso è probabilmente il più importante.Inoltre, se conosci il tuo rev, potrebbe essere utile trovare la sorgente da abbinare alla traccia dello stack. –
Bert, se vuoi ripubblicare come risposta, sono disposto ad accettarlo, si potrebbe dire 'spingendo il curriculum si otterrà la traccia dello stack che ho chiesto' – user602347
Non sei l'unica persona che non poteva capirlo! Hai perfettamente ragione - premi play un paio di volte per far scoppiare l'eccezione, e poi guarda LogCat invece della traccia dello stack. Ho usato molti, molti IDE e mi sembra strano che "quale linea del mio codice è andata male" sembrerebbe essere qualcosa che solo gli esperti possono scoprire ... –