Java proovige ressurssidega (koos näidetega)

Selles õpetuses õpime ressursse proovima ressursse automaatselt sulgeda.

try-with-resourcesAvaldus automaatselt sulgeb kõik ressursid lõpus avaldusega. Ressurss on programmi lõpus suletav objekt.

Selle süntaks on:

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

Nagu ülaltoodud süntaksist nähtub, kuulutame try-with-resourcesavalduse

  1. ressursi kuulutamine ja eksponeerimine tryklauslis.
  2. kõigi ressursi sulgemisel tekkida võivate erandite täpsustamine ja käitlemine.

Märkus . Proovige ressurssidega lause sulgeb kõik ressursid, mis rakendavad liidest AutoCloseable.

Võtame näite, mis kinnitab try-with-resourcesväidet.

Näide 1: proovige ressurssidega

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

Väljund, kui faili test.txt ei leitud.

 IOException proovimise ressurssidega plokis => test.txt (sellist faili ega kataloogi pole) 

Väljund, kui fail test.txt on leitud.

 Sisestage ressurssidega proovimise plokk Line => test rida 

Selles näites kasutame test.txtfailist andmete lugemiseks puhverdatud lugeja eksemplari .

Lauses sisalduva puhverdatud lugeja deklareerimine ja instantsimine try-with-resourcestagab, et selle eksemplar on suletud, hoolimata sellest, kas trylause täidab normaalselt või loob erandi.

Erandi ilmnemisel saab seda käsitleda erandite käitlemise plokkide või visete märksõna abil.

Mahasurutud erandid

Ülaltoodud näites võib try-with-resourcesavaldusest erandeid teha, kui:

  • Faili test.txtei leitud.
  • BufferedReaderObjekti sulgemine .

tryPlokist võib visata ka erandi, kuna faili lugemine võib igal ajal paljudel põhjustel ebaõnnestuda.

Kui nii tryplokist kui ka try-with-resourcesavaldusest tryvisatakse erandeid, siis visatakse plokist erand ja try-with-resourceslause erand on alla surutud.

Tühistatud erandite hankimine

Java 7-s ja uuemates versioonides saab mahasurutud erandid välja kutsuda, kutsudes Throwable.getSuppressed()meetodi tryploki visatud erandist .

See meetod tagastab kõigi mahasurutud erandite massiivi. Tühjendatud erandid saame catchblokist.

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

Ressursside proovimise kasutamise eelised

Siin on ressursside proovimise kasutamise eelised:

1. lõpuks blokeerimine pole vajalik ressursi sulgemiseks

Enne kui Java 7 selle funktsiooni kasutusele võttis, pidime finallyressursi lekke vältimiseks kasutama plokki, et tagada ressursi sulgemine.

Siin on näite 1 sarnane programm . Kuid selles programmis oleme ressursside sulgemiseks kasutanud viimaks blokeerimist.

Näide 2: sulgege ressurss lõpliku blokeerimise abil

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

Väljund

 Proovibloki sisestamine Line => rida failist test.txt Sisestades lõpuks ploki 

Nagu näeme ülaltoodud näitest, finallymuudab ploki kasutamine ressursside puhastamiseks koodi keerukamaks.

Kas märkate ka try… catchplokis olevat finallyplokki? Selle põhjuseks on asjaolu, IOExceptionet BufferedReadereksemplari võib sulgeda ka selle finallyploki sees, nii et see on ka püütud ja käsitsetud.

try-with-resourcesAvaldus teeb automaatse ressursside juhtimine . Me ei pea ressursse sõnaselgelt sulgema, kuna JVM sulgeb need automaatselt. See muudab koodi loetavamaks ja kirjutamise lihtsamaks.

2. proovige ressursse mitme ressursiga

Võime avalduses deklareerida mitu ressurssi try-with-resources, eraldades need semikooloniga;

Näide 3: proovige mitme ressursiga

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

Kui see programm käivitatakse erandeid tegemata, Scannerloeb objekt testRead.txtfailist rea ja kirjutab selle uude testWrite.txtfaili.

Kui tehakse mitu deklaratsiooni, try-with-resourcessulgeb avaldus need ressursid vastupidises järjekorras. Selles näites on PrintWriterobjekt kõigepealt suletud ja seejärel Scannerobjekt suletud.

Java 9 proovimine ressurssidega

Java 7-s on try-with-resourcesavaldusele piirang . Ressurss tuleb selle plokis deklareerida kohapeal.

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

Kui kuulutaksime ressursi väljaspool Java 7 plokki, oleks see loonud tõrketeate.

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

Selle tõrke lahendamiseks parandas Java 9 try-with-resourceslauset nii, et ressursi viidet saaks kasutada ka siis, kui seda pole kohalikult deklareeritud. Ülaltoodud kood käivitatakse nüüd ilma kompileerimisvigadeta.

Huvitavad Artiklid...