Dalam tutorial ini, kita akan belajar mengenai pernyataan cuba-dengan-sumber untuk menutup sumber secara automatik.
The try-with-resources
kenyataan secara automatik menutup semua sumber-sumber pada akhir kenyataan itu. Sumber adalah objek yang akan ditutup pada akhir program.
Sintaksnya adalah:
try (resource declaration) ( // use of the resource ) catch (ExceptionType e1) ( // catch block )
Seperti yang dilihat dari sintaks di atas, kami menyatakan try-with-resources
pernyataan oleh,
- menyatakan dan menyatakan sumber dalam
try
klausa. - menentukan dan menangani semua pengecualian yang mungkin dilemparkan semasa menutup sumber.
Catatan: Pernyataan cuba-dengan-sumber menutup semua sumber yang melaksanakan antara muka AutoCloseable.
Mari kita ambil contoh yang melaksanakan try-with-resources
penyataan tersebut.
Contoh 1: cuba-dengan-sumber
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()); ) ) )
Keluaran jika fail test.txt tidak dijumpai.
IOException dalam blok try-with-resources => test.txt (Tidak ada fail atau direktori tersebut)
Keluaran jika fail test.txt dijumpai.
Memasuki blok cuba-dengan-sumber Garis => garis ujian
Dalam contoh ini, kami menggunakan contoh BufferedReader untuk membaca data dari test.txt
fail.
Menyatakan dan memberi contoh BufferedReader di dalam try-with-resources
pernyataan memastikan bahawa contohnya ditutup tanpa mengira sama ada try
pernyataan itu selesai secara normal atau membuang pengecualian.
Sekiranya berlaku pengecualian, ia dapat ditangani menggunakan blok pengendalian pengecualian atau kata kunci lemparan.
Pengecualian yang Ditegah
Dalam contoh di atas, pengecualian dapat dilemparkan dari try-with-resources
pernyataan apabila:
- Fail
test.txt
tidak dijumpai. - Menutup
BufferedReader
objek.
Pengecualian juga boleh dilemparkan dari try
blok kerana pembacaan fail boleh gagal kerana banyak sebab pada bila-bila masa.
Sekiranya pengecualian dilemparkan dari kedua try
blok dan try-with-resources
pernyataan, pengecualian dari try
blok dilemparkan dan pengecualian dari try-with-resources
penyataan itu dihapuskan.
Mendapatkan Pengecualian Tertekan
Di Java 7 dan yang lebih baru, pengecualian yang ditindas dapat diambil dengan memanggil Throwable.getSuppressed()
kaedah dari pengecualian yang dilemparkan oleh try
blok.
Kaedah ini mengembalikan pelbagai pengecualian yang ditindas. Kami mendapat pengecualian yang tersekat di catch
blok.
catch(IOException e) ( System.out.println("Thrown exception=>" + e.getMessage()); Throwable() suppressedExceptions = e.getSuppressed(); for (int i=0; i" + suppressedExceptions(i)); ) )
Kelebihan menggunakan sumber daya mencuba
Berikut adalah kelebihan menggunakan sumber daya percubaan:
1. akhirnya blok tidak diperlukan untuk menutup sumber
Sebelum Java 7 memperkenalkan fitur ini, kita harus menggunakan finally
blok untuk memastikan sumbernya ditutup untuk mengelakkan kebocoran sumber.
Berikut adalah program yang serupa dengan Contoh 1 . Walau bagaimanapun, dalam program ini, kami akhirnya menggunakan blok untuk menutup sumber.
Contoh 2: Tutup sumber menggunakan blok akhirnya
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()); ) ) ) )
Pengeluaran
Memasuki cuba blok Baris => baris dari fail test.txt Memasuki akhirnya menyekat
Seperti yang dapat kita lihat dari contoh di atas, penggunaan finally
blok untuk membersihkan sumber menjadikan kodnya lebih kompleks.
Perhatikan juga try… catch
blok di finally
blok? Ini kerana IOException
boleh juga berlaku semasa menutup BufferedReader
contoh di dalam finally
blok ini sehingga ia juga tertangkap dan ditangani.
The try-with-resources
kenyataan tidak pengurusan sumber automatik . Kita tidak perlu menutup sumber secara jelas kerana JVM menutupnya secara automatik. Ini menjadikan kod lebih mudah dibaca dan lebih mudah ditulis.
2. cuba-dengan-sumber dengan pelbagai sumber
Kita boleh menyatakan lebih daripada satu sumber dalam try-with-resources
penyataan dengan memisahkannya dengan titik koma;
Contoh 3: cuba dengan pelbagai sumber
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()); ) ) ) )
Sekiranya program ini dijalankan tanpa menghasilkan pengecualian, Scanner
objek membaca baris dari testRead.txt
fail dan menulisnya dalam testWrite.txt
fail baru .
Apabila pelbagai deklarasi dibuat, try-with-resources
pernyataan menutup sumber-sumber ini dalam urutan terbalik. Dalam contoh ini, PrintWriter
objek ditutup terlebih dahulu dan kemudian Scanner
objek ditutup.
Peningkatan sumber daya Java 9
Di Java 7, ada batasan untuk try-with-resources
penyataan tersebut. Sumber tersebut perlu diisytiharkan secara tempatan dalam bloknya.
try (Scanner scanner = new Scanner(new File("testRead.txt"))) ( // code )
Sekiranya kita menyatakan sumber di luar blok di Java 7, itu akan menghasilkan pesan kesalahan.
Scanner scanner = new Scanner(new File("testRead.txt")); try (scanner) ( // code )
Untuk mengatasi ralat ini, Java 9 memperbaiki try-with-resources
pernyataan sehingga rujukan sumber dapat digunakan walaupun tidak diisytiharkan secara tempatan. Kod di atas kini akan dilaksanakan tanpa kesalahan kompilasi.