English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
In questo tutorial, impareremo la dichiarazione try-with-resources per chiudere automaticamente le risorse.
La dichiarazione try-with-resources chiude automaticamente tutte le risorse alla fine dello statement. Le risorse sono gli oggetti che devono essere chiusi alla fine del programma.
La sua sintassi è:
try(resource declaration) { // utilizzo delle risorse } // blocco catch {}
Dalla sintassi, si può vedere che la dichiarazione try-with-resources viene dichiarata nel modo seguente:
Declara e istanzia le risorse all'interno dello statement try.
Specificare e gestire tutte le eccezioni che possono verificarsi durante la chiusura delle risorse.
Attenzione:La dichiarazione try-with-resources chiude tutte le risorse che implementano l'interfaccia AutoCloseable.
Facciamo un esempio di implementazione di una dichiarazione try-with-resources.
import java.io.*; class Main { public static void main(String[] args) { String line; try(BufferedReader br = new BufferedReader(new FileReader("test.txt"))) { while ((line = br.readLine()) != null) { System.out.println("Line =>"+line); {} } finally { {} {} {}
Se non viene trovato il file test.txt, viene eseguito l'output.
IOException nel blocco try-with-resources => test.txt (File o directory non trovato)
Se viene trovato il file test.txt, viene eseguito l'output.
Entrando nel blocco try-with-resources Linea => linea test
In questo esempio, l'istanza BufferedReader che utilizziamo legge i dati dal file test.txt.
Dichiarare e istanziare un BufferedReader all'interno di una dichiarazione try-with-resources garantisce di chiudere l'istanza, sia che lo statement try si completi correttamente o lanci un'eccezione.
Se si verifica un'eccezione, è possibile utilizzare un blocco di gestione delle eccezioni ochiave di parola throwsElaborarla.
Nell'esempio precedente, è possibile lanciare eccezioni da una dichiarazione try-with-resources nelle seguenti circostanze:
Il file test.txt non è stato trovato.
Chiudere l'oggetto BufferedReader.
Può anche essere lanciata un'eccezione dal blocco try, poiché la lettura del file può fallire per molte ragioni in qualsiasi momento.
Se vengono lanciate eccezioni sia dal blocco try che dalla dichiarazione try-with-resources, viene lanciata l'eccezione del blocco try e le eccezioni della dichiarazione try-with-resources vengono soppressa.
In Java 7 e versioni successive, è possibile chiamare il metodo Throwable.getSuppressed() dall'eccezione lanciata nel blocco try per recuperare le eccezioni soppressa.
Questo metodo restituisce un array di tutte le eccezioni soppressa. Abbiamo ricevuto le eccezioni soppressa nel blocco catch.
catch (IOException e) { System.out.println("Eccezione lanciata =>" + e.getMessage()); Throwable[] suppressedExceptions = e.getSuppressed(); for (int i = 0; i < suppressedExceptions.length; i++) { System.out.println("Eccezione soppressa =>" + suppressedExceptions[i]); {} {}
Questi sono i vantaggi dell'uso di try-with-resources:
Prima dell'introduzione di questa funzionalità in Java 7, dovevamo utilizzare il blocco finally per assicurare la chiusura delle risorse per evitare la perdita di risorse.
Questo è simile aEsempio 1 del programmaMa in questo programma, abbiamo utilizzato il blocco finally per chiudere le risorse.
import java.io.*; class Main { public static void main(String[] args) { BufferedReader br = null; String line; try { System.out.println(" 进入try 块 "); br = new BufferedReader(new FileReader("test.txt")); while ((line = br.readLine()) != null) { System.out.println("Line =>"+line); {} } finally { } System.out.println("Entrare nel blocco finally"); try { if (br != null) { br.close(); {} } System.out.println("IOException nel blocco finally =>" + e.getMessage()); {} {} {} {}
Risultato di output
Entrare nel blocco try Line => line dal file test.txt Entrare nel blocco finally
Dal esempio sopra, si può vedere che l'uso del blocco finally per pulire le risorse rende il codice più complesso.
Noti il blocco try ... catch all'interno del blocco finally? Questo è perché potrebbe verificarsi anche IOException durante la chiusura dell'istanza BufferedReader all'interno di questo blocco finally, quindi viene anche catturata e gestita.
Esecuzione dello statement try-with-resourcesGestione automatica delle risorse. Non dobbiamo chiudere esplicitamente le risorse, perché la JVM le chiuderà automaticamente. Questo rende il codice più leggibile e più facile da scrivere.
Possiamo utilizzare il try-with-resources e i punti e virgola per separare più risorse, dichiarando così più risorse nella stessa espressione;
import java.io.*; import java.util.*; class Main { public static void main(String[] args) throws IOException { try (Scanner scanner = new Scanner(new File("testRead.txt"))) { PrintWriter writer = new PrintWriter(new File("testWrite.txt")) { while (scanner.hasNext()) { writer.print(scanner.nextLine()); {} {} {} {}
Se l'esecuzione del programma non genera alcuna eccezione, l'oggetto Scanner legge una riga dal file testRead.txt e la scrive nel nuovo file testWrite.txt.
Quando si eseguono più dichiarazioni, la statement try-with-resources chiude queste risorse nell'ordine inverso. In questo esempio, prima si chiude l'oggetto PrintWriter, poi si chiude l'oggetto Scanner.
La statement try-with-resources in Java 7 ha un limite. La risorsa deve essere dichiarata localmente nel blocco.
try (Scanner scanner = new Scanner(new File("testRead.txt"))) { // code {}
Se dichiariamo le risorse al di fuori del blocco in Java 7, verrà generato un messaggio di errore.
Scanner scanner = new Scanner(new File("testRead.txt")); try (scanner) { // code {}
Per risolvere questo errore, Java 9 ha migliorato la statement try-with-resources, permettendo di utilizzare risorse anche se non dichiarate localmente. Il codice ora eseguirà senza generare alcun errore di compilazione.