Selles õpetuses õpime ressursse proovima ressursse automaatselt sulgeda.
try-with-resources
Avaldus 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-resources
avalduse
- ressursi kuulutamine ja eksponeerimine
try
klauslis. - 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-resources
vä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.txt
failist andmete lugemiseks puhverdatud lugeja eksemplari .
Lauses sisalduva puhverdatud lugeja deklareerimine ja instantsimine try-with-resources
tagab, et selle eksemplar on suletud, hoolimata sellest, kas try
lause 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-resources
avaldusest erandeid teha, kui:
- Faili
test.txt
ei leitud. BufferedReader
Objekti sulgemine .
try
Plokist võib visata ka erandi, kuna faili lugemine võib igal ajal paljudel põhjustel ebaõnnestuda.
Kui nii try
plokist kui ka try-with-resources
avaldusest try
visatakse erandeid, siis visatakse plokist erand ja try-with-resources
lause erand on alla surutud.
Tühistatud erandite hankimine
Java 7-s ja uuemates versioonides saab mahasurutud erandid välja kutsuda, kutsudes Throwable.getSuppressed()
meetodi try
ploki visatud erandist .
See meetod tagastab kõigi mahasurutud erandite massiivi. Tühjendatud erandid saame catch
blokist.
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 finally
ressursi 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, finally
muudab ploki kasutamine ressursside puhastamiseks koodi keerukamaks.
Kas märkate ka try… catch
plokis olevat finally
plokki? Selle põhjuseks on asjaolu, IOException
et BufferedReader
eksemplari võib sulgeda ka selle finally
ploki sees, nii et see on ka püütud ja käsitsetud.
try-with-resources
Avaldus 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, Scanner
loeb objekt testRead.txt
failist rea ja kirjutab selle uude testWrite.txt
faili.
Kui tehakse mitu deklaratsiooni, try-with-resources
sulgeb avaldus need ressursid vastupidises järjekorras. Selles näites on PrintWriter
objekt kõigepealt suletud ja seejärel Scanner
objekt suletud.
Java 9 proovimine ressurssidega
Java 7-s on try-with-resources
avaldusele 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-resources
lauset nii, et ressursi viidet saaks kasutada ka siis, kui seda pole kohalikult deklareeritud. Ülaltoodud kood käivitatakse nüüd ilma kompileerimisvigadeta.