Domanda

Ho un filo in cui prendo tutti gli errori in un grande, onnicomprensivo blocco catch. Lo faccio in modo che possa segnalare eventuali errori, non solo quelli attesi, nella mia applicazione. Il mio Runnable assomiglia a questo:

public final void run()
{
    try
    {
        System.out.println("Do things"); /* [1] */

        doUnsafeThings();
    }
    catch (Throwable t)
    {
        System.out.println("Catch"); /* [2] */

        recover();
    }
    finally
    {
        System.out.println("Finally"); /* [3] */
    }
}

mi aspetterei la NPE per essere catturati dal blocco catch Throwable. Invece, l'uscita a [2] non viene stampata, e nessuno dei due è [3]. L'uscita in [1] viene stampato.

Quello che faccio ottenere sulla console, è questa:

Uncaught exception java/lang/NullPointerException.

Cosa diavolo sta succedendo qui?

Per i documenti del tribunale, sto usando J2ME, e questo è in esecuzione in emulatore WTK v2.5.2 del Sole.

Sono tentato di metterlo giù per JVM realizzazione dodginess ma non posso evitare di pensare che sto solo perdendo qualcosa.

Per chiarire per evitare dubbi (Poiché il codice di esempio è ovviamente alterato dal mio codice di produzione)

  • Non c'è nulla al di fuori del try / catch / finally nel metodo di esecuzione.
  • C'è uno System.out.println all'inizio di ciascuno di questi blocchi -. Quello che segue tali dichiarazioni di console non dovrebbe importare
È stato utile?

Soluzione

La risposta scopre che sono un idiota. Mi piacerebbe spiegare che cosa è andato storto, ma facciamo solo lo chiamano "uno di quei bug".

mi ero momentaneamente dimenticato che il filo che correva l'eseguibile era una classe fili personalizzata (Per ovviare a qualche bug Nokia). Si chiama run() più volte tra le chiamate a un metodo canWait().

Il metodo canWait era responsabile del fallimento, e corsa non stava venendo a mancare affatto. Per finire, ho console-cecità e completamente, ma per sbaglio citato erroneamente la sequenza di eventi nella mia interrogazione.

Altri suggerimenti

Suona come avrete bisogno di un po 'di tentativi ed errori. Posso suggerire:

try {
    doEvilStuff();
} catch (NullPointerException ex) { 
    System.out.println("NPE encountered in body"); 
} catch (Throwable ex) {
    System.out.println("Regular Throwable: " + ex.getMessage());
} finally {
    etc...
}

Per avere una cattura esplicita per NullPointerException, dovrebbe diventare evidente se l'eccezione è all'interno del blocco try o catch / finally bloccare.

Va bene, questa è una supposizione ... ma sarebbe spiegare le cose.

Ovviamente il codice non è effettivamente che - quindi la mia ipotesi è che il pescato (o finalmente) blocco è o facendo qualcosa prima che si registra qualsiasi cosa, o utilizza un registratore diverso dal blocco try. Ad ogni modo, ho il sospetto che sia la cattura o il blocco finally sta gettando l'eccezione.

Non si supponga di avere una traccia dello stack ...

EDIT: Okay, se è solo System.out.println, è qualcosa nella tesi che potrebbe andare Bang? Ad esempio:

catch (Throwable t) {
    // Will go bang if t.getCause() returns null
    System.out.println(t.getCause().getMessage());
}

Se è solo semplice System.out.println("Constant") allora è molto strano.

Sai (ad esempio dalle linee di registro all'interno del blocco try) quanto il blocco try è in realtà sempre?

Quando ho guardato il codice sembra che recuperare () è un'eccezione, in modo che il consiglio dato da Jon sarebbe eccellente da seguire.

Se ci hai dato una traccia dello stack è possibile ottenere una migliore assistenza.

Quando si tenta di intercettare le eccezioni che faccio qualcosa di simile:

try {
  doSomethingBad();
} catch(Exception e) {
   try {
      LogException(...);
   } catch(Exception e) {}       
} finally {
}

Non mi piace eccezioni nido, ma non mi piacciono i miei intercettare le eccezioni di blocco da lancio.

Come si menziona che si sta utilizzando un Runnable - fa questo, per caso, significa che si sta utilizzando più thread come bene? Se il metodo doUnsafeThings() genera internamente un thread diverso di nuovo e che produce l'eccezione, non si potrebbe ottenere nel thread tuo blocco catch è. Vedere http: //java.sun .com / J2SE / 1.5.0 / docs / api / java / lang / Thread.UncaughtExceptionHandler.html

E 'generalmente una cattiva pratica per la cattura di NullPointerException.

I programmatori di solito catturano NullPointerException in tre circostanze:

The program contains a null pointer dereference. Catching the resulting exception was easier than fixing the underlying problem.
The program explicitly throws a NullPointerException to signal an error condition.
The code is part of a test harness that supplies unexpected input to the classes under test. 

Di queste tre circostanze, solo l'ultimo è accettabile. seguendo questo link:

Cattura NullPointerException

E 'possibile che il filo è stato ucciso da qualche altro codice? In generale, un blocco finally sempre esegue meno che il filo è terminata in modo anomalo, mediante System.exit () o qualcosa di simile.

  • Sei sicuro si sta cercando nel posto giusto nel codice? Vale a dire, è il doUnsafeThings () bloccare si sta proteggendo in della traccia dello stack?

  • Forse c'è un problema con il metodo di costruzione, e si esegue il debug di una vecchia versione del codice?

solo aggiungere un po 'di registrazione nei doUnsafeThings (); per vedere se questo metodo sta facendo quello che ci si aspetta (per esempio mettere un tentativo di cattura, infine, e log qualcosa)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top