I denne opplæringen vil vi lære om uttalelsen om prøve-med-ressurser for å lukke ressurser automatisk.
Den try-with-resources
uttalelsen lukkes automatisk alle ressursene på slutten av setningen. En ressurs er et objekt som skal lukkes på slutten av programmet.
Dens syntaks er:
try (resource declaration) ( // use of the resource ) catch (ExceptionType e1) ( // catch block )
Som det fremgår av ovennevnte syntaks, erklærer vi try-with-resources
uttalelsen av,
- erklære og sette i gang ressursen innenfor
try
paragrafen. - spesifisere og håndtere alle unntak som kan kastes når du lukker ressursen.
Merk: Try-with-resources-setningen lukker alle ressursene som implementerer grensesnittet AutoCloseable.
La oss ta et eksempel som implementerer try-with-resources
utsagnet.
Eksempel 1: prøv-med-ressurser
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()); ) ) )
Resultat hvis test.txt-filen ikke blir funnet.
IOException i try-with-resources block => test.txt (Ingen slik fil eller katalog)
Skriv ut hvis test.txt-filen blir funnet.
Å legge inn prøve-med-ressurser blokkerer Linje => testlinje
I dette eksemplet bruker vi en forekomst av BufferedReader for å lese data fra test.txt
filen.
Å erklære og sette i gang BufferedReader inne i try-with-resources
uttalelsen sikrer at forekomsten lukkes uavhengig av om try
utsagnet fullføres normalt eller gir et unntak.
Hvis et unntak oppstår, kan det håndteres ved hjelp av unntakshåndteringsblokkene eller kasteordet.
Undertrykte unntak
I eksemplet ovenfor kan unntak kastes fra try-with-resources
utsagnet når:
- Filen
test.txt
ble ikke funnet. - Lukke
BufferedReader
objektet.
Et unntak kan også kastes fra try
blokken ettersom en fillesing kan mislykkes av mange grunner når som helst.
Hvis unntak kastes fra både try
blokken og try-with-resources
utsagnet, blir unntak fra try
blokken kastet og unntak fra try-with-resources
utsagnet undertrykt.
Henter undertrykte unntak
I Java 7 og senere kan de undertrykte unntakene hentes ved å ringe Throwable.getSuppressed()
metoden fra unntaket som try
blokken kastet .
Denne metoden returnerer en rekke med alle undertrykkede unntak. Vi får de undertrykte unntakene i catch
blokken.
catch(IOException e) ( System.out.println("Thrown exception=>" + e.getMessage()); Throwable() suppressedExceptions = e.getSuppressed(); for (int i=0; i" + suppressedExceptions(i)); ) )
Fordeler med å bruke prøv-med-ressurser
Her er fordelene ved å bruke prøv-med-ressurser:
1. til slutt blokkere ikke nødvendig for å lukke ressursen
Før Java 7 introduserte denne funksjonen, måtte vi bruke finally
blokken for å sikre at ressursen er stengt for å unngå ressurslekkasjer.
Her er et program som ligner på eksempel 1 . I dette programmet har vi imidlertid brukt endelig blokk for å lukke ressurser.
Eksempel 2: Lukk ressurs ved å bruke endelig blokk
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()); ) ) ) )
Produksjon
Entering try block Line => line from test.txt file Angir endelig block
Som vi kan se fra eksemplet ovenfor, gjør bruken av finally
blokk for å rydde opp i ressurser koden mer kompleks.
Notice the try… catch
block in the finally
block as well? This is because an IOException
can also occur while closing the BufferedReader
instance inside this finally
block so it is also caught and handled.
The try-with-resources
statement does automatic resource management. We need not explicitly close the resources as JVM automatically closes them. This makes the code more readable and easier to write.
2. try-with-resources with multiple resources
We can declare more than one resource in the try-with-resources
statement by separating them with a semicolon ;
Example 3: try with multiple resources
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()); ) ) ) )
If this program executes without generating any exceptions, Scanner
object reads a line from the testRead.txt
file and writes it in a new testWrite.txt
file.
Når det blir gjort flere erklæringer, try-with-resources
stenger uttalelsen disse ressursene i omvendt rekkefølge. I dette eksemplet PrintWriter
lukkes objektet først, og deretter Scanner
lukkes objektet.
Forbedring av Java 9-prøve-med-ressurser
I Java 7 er det en begrensning for try-with-resources
uttalelsen. Ressursen må deklareres lokalt innenfor blokken.
try (Scanner scanner = new Scanner(new File("testRead.txt"))) ( // code )
Hvis vi erklærte ressursen utenfor blokken i Java 7, ville den ha generert en feilmelding.
Scanner scanner = new Scanner(new File("testRead.txt")); try (scanner) ( // code )
For å håndtere denne feilen forbedret Java 9 try-with-resources
uttalelsen slik at referansen til ressursen kan brukes selv om den ikke er erklært lokalt. Ovennevnte kode vil nå kjøres uten kompileringsfeil.