În acest tutorial, vom afla despre declarația try-with-resources pentru a închide resursele automat.
try-with-resources
Declarația se închide automat toate resursele de la sfârșitul declarației. O resursă este un obiect care trebuie închis la sfârșitul programului.
Sintaxa sa este:
try (resource declaration) ( // use of the resource ) catch (ExceptionType e1) ( // catch block )
După cum se vede din sintaxa de mai sus, declarăm try-with-resources
declarația prin,
- declararea și instanțierea resursei în cadrul
try
clauzei. - specificând și gestionând toate excepțiile care ar putea fi aruncate în timpul închiderii resursei.
Notă: Instrucțiunea try-with-resources închide toate resursele care implementează interfața AutoCloseable.
Să luăm un exemplu care implementează try-with-resources
afirmația.
Exemplul 1: încercați cu resurse
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()); ) ) )
Ieșiți dacă fișierul test.txt nu este găsit.
IOException în blocul try-with-resources => test.txt (Nu există un astfel de fișier sau director)
Ieșiți dacă este găsit fișierul test.txt.
Introducerea blocului de încercare cu resurse Linie => linie de testare
În acest exemplu, folosim o instanță BufferedReader pentru a citi datele din test.txt
fișier.
Declararea și instanțierea BufferedReader în cadrul try-with-resources
instrucțiunii asigură faptul că instanța sa este închisă indiferent dacă try
instrucțiunea se completează normal sau aruncă o excepție.
Dacă apare o excepție, aceasta poate fi gestionată folosind blocurile de gestionare a excepțiilor sau cuvântul cheie throws.
Excepții suprimate
În exemplul de mai sus, excepțiile pot fi aruncate de la try-with-resources
declarație atunci când:
- Fișierul
test.txt
nu a fost găsit. - Închiderea
BufferedReader
obiectului.
O excepție poate fi, de asemenea, aruncată din try
bloc, deoarece un fișier citit poate eșua din mai multe motive în orice moment.
Dacă sunt aruncate excepții atât din try
bloc cât și din try-with-resources
instrucțiune, excepția din try
bloc este aruncată și excepția din try-with-resources
instrucțiune este suprimată.
Preluarea excepțiilor suprimate
În Java 7 și versiunile ulterioare, excepțiile suprimate pot fi recuperate apelând Throwable.getSuppressed()
metoda din excepția aruncată de try
bloc.
Această metodă returnează o serie de excepții suprimate. Primim excepțiile suprimate din catch
bloc.
catch(IOException e) ( System.out.println("Thrown exception=>" + e.getMessage()); Throwable() suppressedExceptions = e.getSuppressed(); for (int i=0; i" + suppressedExceptions(i)); ) )
Avantajele utilizării încercării cu resurse
Iată avantajele utilizării încercați cu resurse:
1. în cele din urmă blocarea nu este necesară pentru a închide resursa
Înainte ca Java 7 să introducă această caracteristică, a trebuit să folosim finally
blocul pentru a ne asigura că resursa este închisă pentru a evita scurgerile de resurse.
Iată un program similar cu exemplul 1 . Cu toate acestea, în acest program, am folosit în cele din urmă blocarea pentru a închide resursele.
Exemplul 2: Închideți resursa folosind blocul final
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()); ) ) ) )
Ieșire
Introducerea blocului de încercare Linie => linie din fișierul test.txt Introducerea blocului final
După cum putem vedea din exemplul de mai sus, utilizarea finally
blocului pentru curățarea resurselor face codul mai complex.
Observați și try… catch
blocul din finally
bloc? Acest lucru se datorează faptului că o IOException
poate apărea și în timpul închiderii BufferedReader
instanței din interiorul acestui finally
bloc, astfel încât să fie prins și tratat.
try-with-resources
Declarația face de gestionare automată a resurselor . Nu trebuie să închidem explicit resursele, deoarece JVM le închide automat. Acest lucru face codul mai lizibil și mai ușor de scris.
2. încercați cu resurse cu resurse multiple
Putem declara mai multe resurse din try-with-resources
declarație separându-le cu punct și virgulă;
Exemplul 3: încercați cu mai multe resurse
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()); ) ) ) )
Dacă acest program se execută fără a genera excepții, Scanner
obiectul citește o linie din testRead.txt
fișier și o scrie într-un testWrite.txt
fișier nou .
Când se fac mai multe declarații, try-with-resources
declarația închide aceste resurse în ordine inversă. În acest exemplu, PrintWriter
obiectul este închis mai întâi și apoi Scanner
obiectul este închis.
Îmbunătățirea încercării cu resurse Java 9
În Java 7, există o restricție la try-with-resources
declarație. Resursa trebuie declarată local în cadrul blocului său.
try (Scanner scanner = new Scanner(new File("testRead.txt"))) ( // code )
Dacă am declara resursa în afara blocului în Java 7, ar fi generat un mesaj de eroare.
Scanner scanner = new Scanner(new File("testRead.txt")); try (scanner) ( // code )
Pentru a face față acestei erori, Java 9 a îmbunătățit try-with-resources
declarația astfel încât referința resursei să poată fi utilizată chiar dacă nu este declarată local. Codul de mai sus se va executa acum fără nicio eroare de compilare.