2015-10-27 8 views
6

Durante i miei studi all'OCPJP8 ho riscontrato una domanda che non ha una risposta molto chiara a me. Considera il seguente codice:Lanciare l'eccezione di runtime in Closable.close()

public class Animals 
{ 
class Lamb implements Closeable 
{ 
    public void close() 
    { 
     throw new RuntimeException("a"); 
    } 
} 

public static void main(String[] args) 
{ 
    new Animals().run(); 
} 

public void run() 
{ 
    try (Lamb l = new Lamb();) 
    { 
     throw new IOException(); 
    } 
    catch (Exception e) 
    { 
     throw new RuntimeException("c"); 
    } 
} 
} 

In base al libro risposta corretta per una domanda "Quale eccezione verrà lanciata dal codice?" è "Eccezione di runtime c senza eccezione soppressa". Ho controllato questo codice in Eclipse e system.out suggerisce che il libro è giusto. Tuttavia, ho anche modificato il codice un po 'e ha aggiunto il seguente System.out poco prima di gettare RuntimeException "c"

System.out.println(e.getSuppressed().toString()); 

e l'uscita che ho avuto da questo System.out è:

[Ljava.lang.Throwable; @ 75da931b

Quindi, chiaramente c'è un'eccezione soppressa. In modalità di debug, ho anche scoperto che questa eccezione soppressa è quella che aggrotta le sopracciglia nel metodo close().

Due domande: 1. Perché non ci sono informazioni nella console sull'eccezione lanciata nel metodo close()? 2. La risposta data dal libro è corretta?

+0

Come nota a margine, utilizzare 'System.out.println (Arrays.toString (e.getSuppressed()));' per ottenere un risultato più significativo ... – Holger

risposta

3

L'eccezione soppressa (RuntimeException -A) è stato aggiunto alla IOException catturato nel catch e perso dalla stampa traccia dello stack in quanto non è stato passato come il cause del RuntimeException -C.

Così, quando il RuntimeException -C viene stampato dalla main non ha alcuna menzione del IOException o soppressa RuntimeException -A.

E quindi la risposta del libro è corretto perché l'unica eccezione che si propaga dal metodo main è RuntimeException -C senza cause (IOException), e senza alcuna eccezione soppressi (come è stato il IOException).