2013-07-31 11 views
5

Ho eseguito alcuni semplici esperimenti come questo:Il lancio di un'eccezione modifica il suo stato?

public static void main(String[] args) { 
    try { 
     NullPointerException n = new NullPointerException(); 
     System.out.println(Lists.newArrayList(n.getStackTrace())); 
     n.printStackTrace(); 
     System.out.println(Lists.newArrayList(n.getStackTrace())); 
     throw n; 
    } catch (NullPointerException e) { 
     e.printStackTrace(); 
     System.out.println(Lists.newArrayList(e.getStackTrace())); 
    } 
} 

e ottenere output come questo:

java.lang.NullPointerException 
    at MyTest.main(MyTest.java:231) 
java.lang.NullPointerException 
    at MyTest.main(MyTest.java:231) 
[MyTest.main(AbstractScannerTest.java:231)] 
[MyTest.main(AbstractScannerTest.java:231)] 
[MyTest.main(AbstractScannerTest.java:231)] 

ma mi chiedo se tutto ciò viene fatto per un'eccezione quando viene gettato. Questa è una domanda principalmente accademica, anche se potrebbe essere rilevante in determinate circostanze se un'eccezione fosse parte di un'API e potrebbe essere o non essere stata generata quando fornita a un'implementazione.

+0

Per ottenere una traccia stack completa e forse un po 'più di informazioni quando si stampa un errore, è sufficiente fare "System.out.println (e);" o "System.out.println (" errore ", e); 'e dovrebbe stampare l'intero stacktrace. Solo un avviso. – sparks

+3

'printStackTrace' usa' System.err' non 'System.out'. Per fare in modo che l'output sia come previsto, usa 'printStacktrace (System.out)'. –

+1

Si noti che, in Java, la traccia dello stack di eccezioni viene eseguita quando viene creata l'eccezione, non quando viene generata. –

risposta

2

No, l'oggetto Throwable stesso non viene modificato dall'operazione throw; viene semplicemente passato allo stack delle chiamate in modo simile all'argomento di un metodo. Gli oggetti Throwable sono generalmente progettati per essere oggetti immutabili e non hanno setter, sebbene alcuni supportino la modifica della traccia dello stack in modo tale che RPC o framework simili possano assicurarsi che siano incluse le informazioni di tracciamento degli errori appropriate. Detto questo, un Throwable è un oggetto come un altro, e si potrebbe scrivere una classe Throwable con metodi di mutatore da chiamare in un blocco catch, anche se non è normale.

+1

In realtà, Throwable ha diversi metodi che lo muteranno. Il più notevole sarebbe fillInStackTrace che sovrascrive la traccia dello stack acquisita quando è stato creato il Throwable. –

+0

Hai ragione, l'ho scritto male. 'fillInStackTrace', come l'eccezione che ho notato, rende mutabile il' Throwable', ma la maggior parte delle classi di eccezione non ha altri mutatori e quel metodo potrebbe non modificare effettivamente la traccia dello stack se 'writableStackTrace' è' false'. – chrylis

1

Non sono a conoscenza di nulla. Le due cose principali sono

  • quando viene creato il Throwable
  • quando getStackTrace() viene chiamato popola la matrice reale (fino a quel momento viene memorizzato fuori mucchio)
Problemi correlati