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-resources
uttalandet 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-resources
uttalandet av,
- förklara och omedelbar resurs inom
try
klausulen. - 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-resources
uttalandet.
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.txt
filen.
Att deklarera och starta buffertläsaren inuti try-with-resources
uttalandet säkerställer att dess instans stängs oavsett om try
uttalandet 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-resources
uttalandet när:
- Filen
test.txt
hittades inte. - Stänger
BufferedReader
objektet.
Ett undantag kan också kastas från try
blocket eftersom en filläsning kan misslyckas av många anledningar när som helst.
Om undantag kastas från både try
blocket och try-with-resources
uttalandet, undantas undantaget från try
blocket och undantag från try-with-resources
uttalandet.
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 try
blocket.
Denna metod returnerar en matris med alla undertryckta undantag. Vi får de undertryckta undantagen i catch
blocket.
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 finally
blocket 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 finally
block för att städa upp resurser koden mer komplex.
Lägg märke till try… catch
blocket i finally
blocket också? Detta beror på att en också IOException
kan inträffa när BufferedReader
instansen stängs inuti detta finally
block så att den också fångas och hanteras.
Det try-with-resources
uttalandet 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-resources
uttalandet 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 Scanner
läser objektet en rad från testRead.txt
filen och skriver den i en ny testWrite.txt
fil.
När flera deklarationer görs try-with-resources
stänger uttalandet dessa resurser i omvänd ordning. I det här exemplet PrintWriter
stängs objektet först och sedan Scanner
stängs objektet.
Förbättring av Java 9-försök med resurser
I Java 7 finns det en begränsning av try-with-resources
uttalandet. 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-resources
uttalandet 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.