Java-proba s resursima (s primjerima)

U ovom uputstvu naučit ćemo o izjavi try-with-resources za automatsko zatvaranje resursa.

try-with-resourcesIzjava automatski zatvara sve resurse na kraju izjave. Resurs je objekt koji se zatvara na kraju programa.

Njegova sintaksa je:

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

Kao što se vidi iz gornje sintakse, izjavu izjavljujemo try-with-resources,

  1. deklariranje i instanciranje resursa unutar tryklauzule.
  2. specificiranje i rukovanje svim iznimkama koje bi mogle nastati prilikom zatvaranja resursa.

Napomena: Izvještaj try-with-resources zatvara sve resurse koji implementiraju sučelje AutoCloseable.

Uzmimo primjer koji provodi try-with-resourcesizjavu.

Primjer 1: probajte s resursima

 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()); ) ) ) 

Izlaz ako datoteka test.txt nije pronađena.

 IOException u bloku try-with-resources => test.txt (Nema takve datoteke ili direktorija) 

Izlaz ako je pronađena datoteka test.txt.

 Unos bloka try-with-resources Line => test linija 

U ovom primjeru koristimo instancu BufferedReader za čitanje podataka iz test.txtdatoteke.

Deklariranje i instanciranje BufferedReader unutar try-with-resourcesizraza osigurava zatvaranje njegove instance bez obzira na to tryzavršava li se izjava normalno ili baca iznimku.

Ako se dogodi iznimka, njome se može rukovati pomoću blokova za obradu iznimki ili ključne riječi throws.

Potisnute iznimke

U gornjem primjeru, izuzeci se mogu izbaciti iz try-with-resourcesizjave kada:

  • Datoteka test.txtnije pronađena.
  • Zatvaranje BufferedReaderobjekta.

Iznimka se također može izbaciti iz trybloka jer čitanje datoteke može u bilo kojem trenutku iz mnogih razloga zakazati.

Ako se izuzmu izuzeci i iz trybloka i iz try-with-resourcesizraza, tryizbacuje se izuzetak iz bloka i try-with-resourcessuzbija iznimka iz izraza.

Dohvaćanje potisnutih iznimaka

U Javi 7 i novijim, potisnute iznimke mogu se dobiti pozivanjem Throwable.getSuppressed()metode iz iznimke koju je izbacio tryblok.

Ova metoda vraća niz svih potisnutih iznimaka. Potisnute iznimke dobivamo u catchbloku.

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

Prednosti upotrebe isprobavanja-resursa

Evo prednosti korištenja try-with-resources:

1. konačno blok nije potreban za zatvaranje resursa

Prije nego što je Java 7 predstavila ovu značajku, morali smo koristiti finallyblok kako bismo osigurali zatvaranje resursa kako bismo izbjegli curenje resursa.

Evo programa koji je sličan Primjeru 1 . Međutim, u ovom smo programu koristili konačno blok za zatvaranje resursa.

Primjer 2: Zatvorite resurs pomoću bloka konačno

 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()); ) ) ) ) 

Izlaz

 Unos pokušaj bloka Linija => linija iz datoteke test.txt Unos konačnog bloka 

Kao što vidimo iz gornjeg primjera, upotreba finallybloka za čišćenje resursa čini kod složenijim.

Primijetili ste i try… catchblok u finallybloku? To je zato što se an IOExceptionmože dogoditi i prilikom zatvaranja BufferedReaderinstance unutar ovog finallybloka, tako da se i on hvata i njime se rukuje.

try-with-resourcesTvrdnja ni automatsko upravljanje resursima . Ne moramo eksplicitno zatvarati resurse jer ih JVM automatski zatvara. To čini kôd čitljivijim i lakšim za pisanje.

2. probajte s resursima s više resursa

U izjavi možemo prijaviti više resursa try-with-resourcesrazdvajajući ih zarezom;

Primjer 3: pokušajte s više resursa

 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()); ) ) ) ) 

Ako se ovaj program izvrši bez generiranja izuzetaka, Scannerobjekt čita redak iz testRead.txtdatoteke i zapisuje je u novu testWrite.txtdatoteku.

Kada se napravi više deklaracija, try-with-resourcesizjava zatvara te resurse obrnutim redoslijedom. U ovom primjeru PrintWriterobjekt se prvo zatvara, a zatim Scannerzatvara objekt.

Poboljšanje Java 9 s iskustvom

U Javi 7 postoji ograničenje na try-with-resourcesizjavu. Izvor treba deklarirati lokalno unutar svog bloka.

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

Da smo resurs deklarirali izvan bloka u Javi 7, generirao bi poruku o pogrešci.

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

Da bi se riješila ove pogreške, Java 9 poboljšala je try-with-resourcesizjavu tako da se referenca resursa može koristiti čak i ako nije deklarirana lokalno. Gornji kôd sada će se izvršiti bez ikakve pogreške u kompilaciji.

Zanimljivi članci...