Java prøve-med-ressurser (med eksempler)

I denne opplæringen vil vi lære om uttalelsen om prøve-med-ressurser for å lukke ressurser automatisk.

Den try-with-resourcesuttalelsen 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-resourcesuttalelsen av,

  1. erklære og sette i gang ressursen innenfor tryparagrafen.
  2. 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-resourcesutsagnet.

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.txtfilen.

Å erklære og sette i gang BufferedReader inne i try-with-resourcesuttalelsen sikrer at forekomsten lukkes uavhengig av om tryutsagnet 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-resourcesutsagnet når:

  • Filen test.txtble ikke funnet.
  • Lukke BufferedReaderobjektet.

Et unntak kan også kastes fra tryblokken ettersom en fillesing kan mislykkes av mange grunner når som helst.

Hvis unntak kastes fra både tryblokken og try-with-resourcesutsagnet, blir unntak fra tryblokken kastet og unntak fra try-with-resourcesutsagnet undertrykt.

Henter undertrykte unntak

I Java 7 og senere kan de undertrykte unntakene hentes ved å ringe Throwable.getSuppressed()metoden fra unntaket som tryblokken kastet .

Denne metoden returnerer en rekke med alle undertrykkede unntak. Vi får de undertrykte unntakene i catchblokken.

 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 finallyblokken 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 finallyblokk 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-resourcesstenger uttalelsen disse ressursene i omvendt rekkefølge. I dette eksemplet PrintWriterlukkes objektet først, og deretter Scannerlukkes objektet.

Forbedring av Java 9-prøve-med-ressurser

I Java 7 er det en begrensning for try-with-resourcesuttalelsen. 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-resourcesuttalelsen slik at referansen til ressursen kan brukes selv om den ikke er erklært lokalt. Ovennevnte kode vil nå kjøres uten kompileringsfeil.

Interessante artikler...