Java-försök-med-resurser (med exempel)

I den här handledningen lär vi oss om försöket med resurser för att stänga resurser automatiskt.

Det try-with-resourcesuttalandet stängs automatiskt alla resurser i slutet av meddelandet. En resurs är ett objekt som ska stängas i slutet av programmet.

Dess syntax är:

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

Som framgår av ovanstående syntax förklarar vi try-with-resourcesuttalandet av,

  1. förklara och omedelbar resurs inom tryklausulen.
  2. specificera och hantera alla undantag som kan kastas när resursen stängs.

Obs! Uttrycket försök med resurser stänger alla resurser som implementerar gränssnittet för automatisk stängning.

Låt oss ta ett exempel som implementerar try-with-resourcesuttalandet.

Exempel 1: försök med resurser

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

Output om test.txt-filen inte hittas.

 IOException i försök med resurser block => test.txt (Ingen sådan fil eller katalog) 

Mata ut om test.txt-filen hittas.

 Ange försök med resurser blockera Line => testrad 

I det här exemplet använder vi en instans av BufferedReader för att läsa data från test.txtfilen.

Att deklarera och starta buffertläsaren inuti try-with-resourcesuttalandet säkerställer att dess instans stängs oavsett om tryuttalandet slutförs normalt eller ger ett undantag.

Om ett undantag inträffar kan det hanteras med hjälp av undantagshanteringsblocken eller nyckelordet.

Undertryckta undantag

I exemplet ovan kan undantag kastas från try-with-resourcesuttalandet när:

  • Filen test.txthittades inte.
  • Stänger BufferedReaderobjektet.

Ett undantag kan också kastas från tryblocket eftersom en filläsning kan misslyckas av många anledningar när som helst.

Om undantag kastas från både tryblocket och try-with-resourcesuttalandet, undantas undantaget från tryblocket och undantag från try-with-resourcesuttalandet.

Hämtar undertryckta undantag

I Java 7 och senare kan de undertryckta undantagen hämtas genom att anropa Throwable.getSuppressed()metoden från det undantag som kastats av tryblocket.

Denna metod returnerar en matris med alla undertryckta undantag. Vi får de undertryckta undantagen i catchblocket.

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

Fördelar med att använda försök-med-resurser

Här är fördelarna med att använda try-with-resources:

1. slutligen blockera inte krävs för att stänga resursen

Innan Java 7 introducerade den här funktionen var vi tvungna att använda finallyblocket för att säkerställa att resursen är stängd för att undvika resursläckor.

Här är ett program som liknar exempel 1 . Men i detta program har vi äntligen använt block för att stänga resurser.

Exempel 2: Stäng resurs med slutligen blockera

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

Produktion

 Entering try block Line => line from test.txt file Entering slutligen block 

Som vi kan se från ovanstående exempel gör användningen av finallyblock för att städa upp resurser koden mer komplex.

Lägg märke till try… catchblocket i finallyblocket också? Detta beror på att en också IOExceptionkan inträffa när BufferedReaderinstansen stängs inuti detta finallyblock så att den också fångas och hanteras.

Det try-with-resourcesuttalandet gör automatisk resurshantering . Vi behöver inte uttryckligen stänga resurserna eftersom JVM automatiskt stänger dem. Detta gör koden mer läsbar och lättare att skriva.

2. försök med resurser med flera resurser

Vi kan deklarera mer än en resurs i try-with-resourcesuttalandet genom att separera dem med semikolon;

Exempel 3: försök med flera resurser

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

Om det här programmet körs utan att generera några undantag Scannerläser objektet en rad från testRead.txtfilen och skriver den i en ny testWrite.txtfil.

När flera deklarationer görs try-with-resourcesstänger uttalandet dessa resurser i omvänd ordning. I det här exemplet PrintWriterstängs objektet först och sedan Scannerstängs objektet.

Förbättring av Java 9-försök med resurser

I Java 7 finns det en begränsning av try-with-resourcesuttalandet. Resursen måste deklareras lokalt inom sitt block.

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

Om vi ​​deklarerade resursen utanför blocket i Java 7 skulle det ha genererat ett felmeddelande.

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

För att hantera detta fel förbättrade Java 9 try-with-resourcesuttalandet så att referens för resursen kan användas även om den inte deklareras lokalt. Ovanstående kod kommer nu att köras utan kompileringsfel.

Intressanta artiklar...