Il punto principale di try-with-risorse è quello di assicurarsi le risorse sono chiuse, senza richiedere il codice dell'applicazione per farlo. Ci sono alcuni punti migliori da considerare, però.
Quando non si utilizza try-with-resources, c'è una potenziale trappola chiamata mascheramento delle eccezioni. Quando il codice in un blocco try genera un'eccezione e anche il metodo close in infine genera un'eccezione, l'eccezione generata dal blocco try viene persa e l'eccezione generata infine viene propagata. Questo di solito è sfortunato, poiché l'eccezione lanciata alla chiusura è qualcosa di inutile mentre l'utile eccezione è quella informativa. L'utilizzo di try-with-resources per chiudere le risorse impedirà l'esecuzione di qualsiasi mascheramento delle eccezioni.
Come parte del fare in modo che il mascheramento delle eccezioni non perda importanti informazioni sulle eccezioni, quando è stato sviluppato try-with-resources hanno dovuto decidere cosa fare con le eccezioni generate dal metodo close.
Con try-con-le risorse, se il blocco try genera un'eccezione e il metodo close lancia anche un'eccezione, quindi the exception from the close block gets tacked on to the original exception:
... ci sono situazioni in cui due eccezioni indipendenti possono essere gettati in blocchi di codice fratello, in particolare nel blocco try di un'istruzione try-with-resources e il blocco finally generato dal compilatore che chiude la risorsa. In queste situazioni, solo una delle eccezioni generate può essere propagata. Nell'istruzione try-with-resources, quando esistono due eccezioni di questo tipo, l'eccezione proveniente dal blocco try viene propagata e l'eccezione dal blocco finally viene aggiunta all'elenco delle eccezioni soppresse dall'eccezione dal blocco try. Come un'eccezione svolge lo stack, può accumulare più eccezioni soppresse.
D'altra parte, se il codice completa normalmente, ma la risorsa che si sta utilizzando genera un'eccezione su una stretta, si butta tale eccezione (che andrebbe soppresso se il codice nel blocco try ha gettato nulla). Pertanto, se si dispone di un codice JDBC in cui un ResultSet o PreparedStatement viene chiuso da try-with-resources, può essere generata un'eccezione risultante da un problema tecnico dell'infrastruttura quando un oggetto JDBC viene chiuso e può eseguire il rollback di un'operazione completata correttamente.
Senza try-with-resources se l'eccezione del metodo close viene generata è fino al codice dell'applicazione.Se viene lanciato in un blocco finally quando il blocco try genera un'eccezione, l'eccezione dal blocco finally maschera l'altra eccezione. Ma lo sviluppatore ha la possibilità di catturare l'eccezione generata da vicino e non propagarla.
la differenza è che non è necessario chiamare stream.close() nella risorsa try-wth. Si chiama automaticamente af se hai una clausola finale che la chiude. Solo gli oggetti che impiantano Closeable o AutoCloseable possono essere utilizzati nella clausola try-with-Resuce. – sturcotte06
Non è necessario (o molto probabilmente non dovrebbe) chiamare 'stream.close();' nella sezione 'try {..}'. Dovrebbe essere fatto nella sezione 'finally' che try-with-resources gestirà per te (BTW try-with-resources può gestire più risorse). – Pshemo