„Java try-with-resources“ (su pavyzdžiais)

Šioje pamokoje sužinosime apie „try-with-resources“ teiginį, kad ištekliai būtų automatiškai uždaryti.

try-with-resourcesPareiškimas automatiškai užsidaro visi išteklius pareiškimo pabaigoje. Ištekliai yra objektas, kuris turi būti uždarytas programos pabaigoje.

Jo sintaksė yra:

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

Kaip matyti iš pirmiau nurodytos sintaksės, pareiškimą deklaruojame try-with-resources,

  1. išteklių deklaravimas ir išaiškinimas pagal trysąlygą.
  2. nurodant ir tvarkant visas išimtis, kurios gali būti pateikiamos uždarant šaltinį.

Pastaba: „try-with-resources“ sakinys uždaro visus išteklius, kuriuose įdiegta „AutoCloseable“ sąsaja.

Paimkime pavyzdį, kuris įgyvendina try-with-resourcesteiginį.

1 pavyzdys: pabandykite naudoti išteklius

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

Išvestis, jei failas test.txt nerastas.

 IOException „try-with-resources block“ => test.txt (tokio failo ar katalogo nėra) 

Išvestis, jei randamas failas test.txt.

 Įveskite bandymo su ištekliais bloką Linija => bandymo eilutė 

Šiame pavyzdyje duomenims iš test.txtfailo nuskaityti naudojame „BufferedReader“ egzempliorių .

Deklaravus ir try-with-resourcesišaiškinant teiginį „ BufferedReader“ sakinyje, užtikrinama, kad jo egzempliorius bus uždarytas, neatsižvelgiant į tai, ar tryteiginys užbaigiamas paprastai, ar išmeta išimtį.

Jei įvyksta išimtis, ją galima tvarkyti naudojant išimčių tvarkymo blokus arba metimų raktinį žodį.

Užgniaužtos išimtys

Ankstesniame pavyzdyje išimtis gali būti pateikiama iš try-with-resourcesteiginio, kai:

  • Failas test.txtnerastas.
  • BufferedReaderObjekto uždarymas .

Išimtis taip pat gali būti išmesta iš trybloko, nes skaityti failą bet kuriuo metu gali nepavykti dėl daugelio priežasčių.

Jei išimtis išmetama tiek iš trybloko, tiek iš try-with-resourcessakinio, išimtis iš trybloko išmetama ir išimtis iš try-with-resourcessakinio yra slopinama.

Uždraustų išimčių gavimas

„Java 7“ ir naujesnėse versijose užblokuotas išimtis galima gauti iškvietus Throwable.getSuppressed()metodą iš trybloko išmestos išimties .

Šis metodas pateikia visų užblokuotų išimčių masyvą. catchUžblokuotas išimtis gauname bloke.

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

Privalumai naudojant bandomuosius išteklius

Štai „try-with-resources“ naudojimo pranašumai:

1. pagaliau blokuoti nereikia uždaryti šaltinį

Prieš „Java 7“ pristatydami šią funkciją, turėjome naudoti finallybloką, kad įsitikintume, jog šaltinis yra uždarytas, kad išvengtume išteklių nutekėjimo.

Štai programa, panaši į 1 pavyzdį . Tačiau šioje programoje mes panaudojome galutinį blokavimą, kad uždarytume išteklius.

2 pavyzdys: Uždarykite išteklius naudodami galutinai bloką

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

Rezultatas

 Įveskite bandymo bloką Line => eilutė iš test.txt failo Įveskite galiausiai bloką 

Kaip matome iš aukščiau pateikto pavyzdžio, naudojant finallybloką išvalyti išteklius, kodas tampa sudėtingesnis.

Pastebite ir try… catchbloką finallybloke? Taip yra todėl, kad IOExceptiontaip pat gali atsirasti uždarant BufferedReaderegzempliorių šio finallybloko viduje, taigi jis taip pat yra sugautas ir tvarkomas.

try-with-resourcesPareiškimas daro automatinį išteklių valdymą . Mums nereikia aiškiai uždaryti išteklių, nes JVM automatiškai juos uždaro. Tai daro kodą lengviau įskaitomą ir lengviau rašomą.

2. išbandyti su ištekliais su keliais ištekliais

Pareiškime galime deklaruoti daugiau nei vieną šaltinį, try-with-resourcesatskirdami juos kabliataškiu;

3 pavyzdys: bandykite naudodami kelis išteklius

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

Jei ši programa vykdoma nesukuriant jokių išimčių, Scannerobjektas nuskaito testRead.txtfailo eilutę ir įrašo ją į naują testWrite.txtfailą.

Kai pateikiamos kelios deklaracijos, try-with-resourcespareiškimas uždaro šiuos išteklius atvirkštine tvarka. Šiame pavyzdyje PrintWriterobjektas pirmiausia uždaromas, o tada Scannerobjektas uždaromas.

„Java 9“ bandymas su ištekliais

„Java 7“ yra try-with-resourcesteiginio apribojimas . Išteklius reikia deklaruoti vietoje jo bloke.

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

Jei išteklius paskelbtume už „Java 7“ bloko ribų, tai būtų sugeneravęs klaidos pranešimą.

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

Norėdami pašalinti šią klaidą, „Java 9“ patobulino try-with-resourcesteiginį, kad ištekliaus nuorodą būtų galima naudoti, net jei ji nėra deklaruojama vietoje. Pirmiau pateiktas kodas bus vykdomas be kompiliavimo klaidos.

Įdomios straipsniai...