Citando dalla sezione JLS 14.20.3.1:
In una dichiarazione di base try-con-le risorse che gestisce una singola risorsa:
Ciò significa che se sia il codice all'interno del try
blocco e il close()
dichiarazione automatica un'eccezione, la parte catch
gestirà l'eccezione generata dal blocco try
, con l'eccezione generata dal close()
nel suppressed exceptions .
Inoltre, ciò significa che se il blocco try
ha successo ma l'automatico close()
fallisce, il catch
sarà davanzale essere eseguito e l'eccezione catched sarà l'eccezione generata da close()
.
Ecco un test per verificare questo comportamento:
public class Main {
public static void main(String[] args) throws Exception {
// try block fails and close() fails
try (T t = new T()) {
throw new Exception("thrown by try part");
} catch (Exception e) {
System.out.println(e.getMessage());
System.out.println(e.getSuppressed()[0].getMessage());
}
// try block is successful but close() fails
try (T t = new T()) {
//
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
class T implements AutoCloseable {
@Override
public void close() throws Exception {
throw new Exception("thrown by close");
}
}
Questo codice stamperà
thrown by try part
thrown by close
thrown by close
il che significa che l'eccezione catturato è stato l'eccezione generata dalla parte try del codice per la prima parte. Per la seconda parte, l'eccezione rilevata era effettivamente l'eccezione generata da close()
.
C'è un'istruzione catch che gestirà le eccezioni generate dal 'try'. Non so come queste eccezioni saranno gettate nel mondo esterno. –
se la risorsa chiudibile genera un'eccezione quando è chiusa, l'eccezione che si è verificata nel blocco try è più rilevante, quindi è propagata – Chris
Per favore leggi di nuovo la domanda, guarda che OP sta chiaramente affermando che ** c'è un'istruzione 'catch' in uso ** –