Prova Java con risorse (con esempi)

In questo tutorial, impareremo l'istruzione try-with-resources per chiudere automaticamente le risorse.

L' try-with-resourcesistruzione chiude automaticamente tutte le risorse alla fine dell'istruzione. Una risorsa è un oggetto da chiudere alla fine del programma.

La sua sintassi è:

 try (resource declaration) ( // use of the resource ) catch (ExceptionType e1) ( // catch block ) 

Come visto dalla sintassi sopra, dichiariamo la try-with-resourcesdichiarazione di,

  1. dichiarare e istanziare la risorsa all'interno della tryclausola.
  2. specificando e gestendo tutte le eccezioni che potrebbero essere generate durante la chiusura della risorsa.

Nota: l'istruzione try-with-resources chiude tutte le risorse che implementano l'interfaccia AutoCloseable.

Prendiamo un esempio che implementa l' try-with-resourcesaffermazione.

Esempio 1: prova con le risorse

 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); ) ) catch (IOException e) ( System.out.println("IOException in try block =>" + e.getMessage()); ) ) ) 

Output se il file test.txt non viene trovato.

 IOException nel blocco try-with-resources => test.txt (Nessun file o directory di questo tipo) 

Emissione se viene trovato il file test.txt.

 Entrando nel blocco try-with-resources Line => test line 

In questo esempio, utilizziamo un'istanza di BufferedReader per leggere i dati dal test.txtfile.

Dichiarare e creare un'istanza del BufferedReader all'interno try-with-resourcesdell'istruzione garantisce che la sua istanza venga chiusa indipendentemente dal fatto che l' tryistruzione venga completata normalmente o generi un'eccezione.

Se si verifica un'eccezione, può essere gestita utilizzando i blocchi di gestione delle eccezioni o la parola chiave throws.

Eccezioni soppresse

Nell'esempio precedente, è possibile generare eccezioni dall'istruzione try-with-resourcesquando:

  • Il file test.txtnon è stato trovato.
  • Chiusura BufferedReaderdell'oggetto.

È inoltre possibile lanciare un'eccezione dal tryblocco poiché la lettura di un file può non riuscire per molti motivi in ​​qualsiasi momento.

Se vengono generate eccezioni sia dal tryblocco che try-with-resourcesdall'istruzione, tryviene generata l'eccezione dal blocco e l'eccezione try-with-resourcesdall'istruzione viene soppressa.

Recupero delle eccezioni soppresse

In Java 7 e versioni successive, le eccezioni soppresse possono essere recuperate chiamando il Throwable.getSuppressed()metodo dall'eccezione generata dal tryblocco.

Questo metodo restituisce una matrice di tutte le eccezioni soppresse. Otteniamo le eccezioni soppresse nel catchblocco.

 catch(IOException e) ( System.out.println("Thrown exception=>" + e.getMessage()); Throwable() suppressedExceptions = e.getSuppressed(); for (int i=0; i" + suppressedExceptions(i)); ) ) 

Vantaggi dell'utilizzo di try-with-resources

Ecco i vantaggi dell'utilizzo di try-with-resources:

1. infine blocco non necessario per chiudere la risorsa

Prima che Java 7 introducesse questa funzione, dovevamo usare il finallyblocco per assicurarci che la risorsa fosse chiusa per evitare perdite di risorse.

Ecco un programma simile all'Esempio 1 . Tuttavia, in questo programma, abbiamo utilizzato finalmente il blocco per chiudere le risorse.

Esempio 2: chiudere la risorsa utilizzando infine il blocco

 import java.io.*; class Main ( public static void main(String() args) ( BufferedReader br = null; String line; try ( System.out.println("Entering try block"); br = new BufferedReader(new FileReader("test.txt")); while ((line = br.readLine()) != null) ( System.out.println("Line =>"+line); ) ) catch (IOException e) ( System.out.println("IOException in try block =>" + e.getMessage()); ) finally ( System.out.println("Entering finally block"); try ( if (br != null) ( br.close(); ) ) catch (IOException e) ( System.out.println("IOException in finally block =>"+e.getMessage()); ) ) ) ) 

Produzione

 Entrando in try block Line => line dal file test.txt Entrando infine in block 

Come possiamo vedere dall'esempio sopra, l'uso di finallyblock per ripulire le risorse rende il codice più complesso.

Notate anche il try… catchblocco nel finallyblocco? Questo perché IOExceptionpuò verificarsi anche durante la chiusura BufferedReaderdell'istanza all'interno di questo finallyblocco, quindi viene anche catturata e gestita.

L' try-with-resourcesistruzione esegue la gestione automatica delle risorse . Non è necessario chiudere esplicitamente le risorse poiché JVM le chiude automaticamente. Ciò rende il codice più leggibile e più facile da scrivere.

2. prova con risorse con più risorse

Possiamo dichiarare più di una risorsa try-with-resourcesnell'istruzione separandole con un punto e virgola;

Esempio 3: prova con più risorse

 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 questo programma viene eseguito senza generare eccezioni, l' Scanneroggetto legge una riga dal testRead.txtfile e la scrive in un nuovo testWrite.txtfile.

Quando vengono effettuate più dichiarazioni, l' try-with-resourcesistruzione chiude queste risorse in ordine inverso. In questo esempio, l' PrintWriteroggetto viene chiuso prima e poi l' Scanneroggetto viene chiuso.

Miglioramento della prova con le risorse di Java 9

In Java 7, c'è una limitazione try-with-resourcesall'istruzione. La risorsa deve essere dichiarata localmente all'interno del suo blocco.

 try (Scanner scanner = new Scanner(new File("testRead.txt"))) ( // code ) 

Se avessimo dichiarato la risorsa fuori dal blocco in Java 7, avrebbe generato un messaggio di errore.

 Scanner scanner = new Scanner(new File("testRead.txt")); try (scanner) ( // code ) 

Per affrontare questo errore, Java 9 ha migliorato l' try-with-resourcesistruzione in modo che il riferimento della risorsa possa essere utilizzato anche se non è dichiarato localmente. Il codice sopra verrà ora eseguito senza alcun errore di compilazione.

Articoli interessanti...