Încercați cu resurse Java (cu exemple)

În acest tutorial, vom afla despre declarația try-with-resources pentru a închide resursele automat.

try-with-resourcesDeclaraț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-resourcesdeclarația prin,

  1. declararea și instanțierea resursei în cadrul tryclauzei.
  2. 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-resourcesafirmaț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.txtfișier.

Declararea și instanțierea BufferedReader în cadrul try-with-resourcesinstrucțiunii asigură faptul că instanța sa este închisă indiferent dacă tryinstrucț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-resourcesdeclarație atunci când:

  • Fișierul test.txtnu a fost găsit.
  • Închiderea BufferedReaderobiectului.

O excepție poate fi, de asemenea, aruncată din trybloc, deoarece un fișier citit poate eșua din mai multe motive în orice moment.

Dacă sunt aruncate excepții atât din trybloc cât și din try-with-resourcesinstrucțiune, excepția din trybloc este aruncată și excepția din try-with-resourcesinstrucț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 trybloc.

Această metodă returnează o serie de excepții suprimate. Primim excepțiile suprimate din catchbloc.

 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 finallyblocul 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 finallyblocului pentru curățarea resurselor face codul mai complex.

Observați și try… catchblocul din finallybloc? Acest lucru se datorează faptului că o IOExceptionpoate apărea și în timpul închiderii BufferedReaderinstanței din interiorul acestui finallybloc, astfel încât să fie prins și tratat.

try-with-resourcesDeclaraț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-resourcesdeclaraț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, Scannerobiectul citește o linie din testRead.txtfișier și o scrie într-un testWrite.txtfișier nou .

Când se fac mai multe declarații, try-with-resourcesdeclarația închide aceste resurse în ordine inversă. În acest exemplu, PrintWriterobiectul este închis mai întâi și apoi Scannerobiectul este închis.

Îmbunătățirea încercării cu resurse Java 9

În Java 7, există o restricție la try-with-resourcesdeclaraț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-resourcesdeclaraț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.

Articole interesante...