Šioje pamokoje sužinosime apie „try-with-resources“ teiginį, kad ištekliai būtų automatiškai uždaryti.
try-with-resources
Pareiš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
,
- išteklių deklaravimas ir išaiškinimas pagal
try
sąlygą. - 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-resources
teiginį.
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.txt
failo nuskaityti naudojame „BufferedReader“ egzempliorių .
Deklaravus ir try-with-resources
išaiškinant teiginį „ BufferedReader“ sakinyje, užtikrinama, kad jo egzempliorius bus uždarytas, neatsižvelgiant į tai, ar try
teiginys 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-resources
teiginio, kai:
- Failas
test.txt
nerastas. BufferedReader
Objekto uždarymas .
Išimtis taip pat gali būti išmesta iš try
bloko, nes skaityti failą bet kuriuo metu gali nepavykti dėl daugelio priežasčių.
Jei išimtis išmetama tiek iš try
bloko, tiek iš try-with-resources
sakinio, išimtis iš try
bloko išmetama ir išimtis iš try-with-resources
sakinio 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š try
bloko išmestos išimties .
Šis metodas pateikia visų užblokuotų išimčių masyvą. catch
Už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 finally
bloką, 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 finally
bloką išvalyti išteklius, kodas tampa sudėtingesnis.
Pastebite ir try… catch
bloką finally
bloke? Taip yra todėl, kad IOException
taip pat gali atsirasti uždarant BufferedReader
egzempliorių šio finally
bloko viduje, taigi jis taip pat yra sugautas ir tvarkomas.
try-with-resources
Pareiš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-resources
atskirdami 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ų, Scanner
objektas nuskaito testRead.txt
failo eilutę ir įrašo ją į naują testWrite.txt
failą.
Kai pateikiamos kelios deklaracijos, try-with-resources
pareiškimas uždaro šiuos išteklius atvirkštine tvarka. Šiame pavyzdyje PrintWriter
objektas pirmiausia uždaromas, o tada Scanner
objektas uždaromas.
„Java 9“ bandymas su ištekliais
„Java 7“ yra try-with-resources
teiginio 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-resources
teiginį, kad ištekliaus nuorodą būtų galima naudoti, net jei ji nėra deklaruojama vietoje. Pirmiau pateiktas kodas bus vykdomas be kompiliavimo klaidos.