Java izmēģināt ar resursiem (ar piemēriem)

Šajā apmācībā mēs uzzināsim par mēģinājumu ar resursiem automātiski aizvērt resursus.

try-with-resourcesPaziņojums automātiski aizver visus resursus beigās paziņojumu. Resurss ir objekts, kas jāaizver programmas beigās.

Tās sintakse ir:

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

Kā redzams no iepriekš minētās sintakses, paziņojumu try-with-resourcespaziņojam,

  1. resursa deklarēšana un instancēšana tryklauzulas ietvaros.
  2. norādot un apstrādājot visus izņēmumus, kas varētu rasties, aizverot resursu.

Piezīme . Izmēģinājums ar resursiem aizver visus resursus, kas ievieš saskarni AutoCloseable.

Ņemsim piemēru, kas īsteno try-with-resourcespaziņojumu.

1. piemērs: izmēģiniet ar resursiem

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

Izeja, ja fails test.txt nav atrasts.

 IOException izmēģinājuma ar resursiem blokā => test.txt (Nav šāda faila vai direktorija) 

Izeja, ja ir atrasts fails test.txt.

 Ievadot izmēģinājuma ar resursiem bloku Line => testa rindiņa 

Šajā piemērā mēs izmantojam BufferedReader gadījumu, lai nolasītu datus no test.txtfaila.

Paziņojot un izsaucot BufferedReader try-with-resourcespaziņojumā, tiek nodrošināts, ka tā eksemplārs ir aizvērts neatkarīgi no tā, vai tryizraksts tiek aizpildīts normāli vai izņēmums.

Ja rodas izņēmums, to var apstrādāt, izmantojot izņēmumu apstrādes blokus vai metienu atslēgvārdu.

Apspiesti izņēmumi

Iepriekš minētajā piemērā izņēmumus var ietvert no try-with-resourcespaziņojuma, ja:

  • Fails test.txtnav atrasts.
  • BufferedReaderObjekta aizvēršana .

Izņēmumu var arī izmest no trybloka, jo failu lasīšana var neizdoties daudzu iemeslu dēļ jebkurā laikā.

Ja izņēmumi tiek izmesti gan no trybloka, gan no try-with-resourcespaziņojuma, trytiek izmests izņēmums no bloka un izņēmums no try-with-resourcespaziņojuma tiek nomākts.

Nomākto izņēmumu izgūšana

Java 7 un jaunākās versijās nomāktos izņēmumus var iegūt, izsaucot Throwable.getSuppressed()metodi no trybloka mestā izņēmuma .

Šī metode atgriež visu nomākto izņēmumu masīvu. catchBlokā mēs saņemam nomāktos izņēmumus .

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

Priekšrocības, izmantojot izmēģināšanas resursus

Šeit ir priekšrocības, izmantojot izmēģināšanas resursus:

1. beidzot bloķēt nav nepieciešams, lai aizvērtu resursu

Pirms Java 7 ieviesa šo funkciju, mums bija jāizmanto finallybloks, lai pārliecinātos, ka resurss ir aizvērts, lai izvairītos no resursu noplūdes.

Šeit ir programma, kas ir līdzīga 1. piemēram . Tomēr šajā programmā mēs esam izmantojuši beidzot bloķēšanu, lai aizvērtu resursus.

2. piemērs: aizveriet resursu, beidzot bloķējot

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

Rezultāts

 Ievadot mēģinājuma bloku Line => line no faila test.txt, beidzot ievadot bloku 

Kā redzams no iepriekš minētā piemēra, finallybloka izmantošana resursu attīrīšanai padara kodu sarežģītāku.

Vai pamanāt arī try… catchbloku finallyblokā? Tas notiek tāpēc, ka IOExceptionvar rasties arī, aizverot BufferedReaderinstanci šī finallybloka iekšienē, tāpēc tas tiek arī noķerts un apstrādāts.

try-with-resourcesPaziņojums nav automātisku resursu pārvaldību . Mums nav skaidri jāaizver resursi, jo JVM tos automātiski aizver. Tas padara kodu vieglāk lasāmu un vieglāk rakstāmu.

2. izmēģināt ar resursiem ar vairākiem resursiem

Mēs varam deklarēt vairāk nekā vienu resursu try-with-resourcespaziņojumā, atdalot tos ar semikolu;

3. piemērs: mēģiniet ar vairākiem resursiem

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

Ja šī programma tiek izpildīta, neradot nekādus izņēmumus, Scannerobjekts nolasa testRead.txtfaila rindiņu un ieraksta to jaunā testWrite.txtfailā.

Kad tiek veiktas vairākas deklarācijas, try-with-resourcespaziņojums aizver šos resursus apgrieztā secībā. Šajā piemērā PrintWriterobjekts vispirms tiek aizvērts un pēc tam Scannerobjekts tiek aizvērts.

Java 9 izmēģināšanas ar resursiem uzlabošana

Programmā Java 7 try-with-resourcesapgalvojumam ir ierobežojums . Resurss ir jādeklarē lokāli tā blokā.

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

Ja mēs deklarētu resursu ārpus Java 7 bloka, tas būtu ģenerējis kļūdas ziņojumu.

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

Lai novērstu šo kļūdu, Java 9 uzlaboja try-with-resourcespaziņojumu, lai resursa atsauci varētu izmantot pat tad, ja tā nav deklarēta lokāli. Iepriekš minētais kods tiks izpildīts bez kompilācijas kļūdas.

Interesanti raksti...