Dalam tutorial ini, kita akan belajar tentang pernyataan coba-dengan-sumber daya untuk menutup sumber daya secara otomatis.
The try-with-resources
pernyataan secara otomatis menutup semua sumber daya pada akhir pernyataan tersebut. Sumber daya adalah objek yang akan ditutup pada akhir program.
Sintaksnya adalah:
try (resource declaration) ( // use of the resource ) catch (ExceptionType e1) ( // catch block )
Seperti yang terlihat dari sintaks di atas, kami mendeklarasikan try-with-resources
pernyataan dengan,
- mendeklarasikan dan membuat instance sumber daya dalam
try
klausa. - menentukan dan menangani semua pengecualian yang mungkin muncul saat menutup sumber daya.
Catatan: Pernyataan coba-dengan-sumber daya menutup semua sumber daya yang menerapkan antarmuka AutoCloseable.
Mari kita ambil contoh yang mengimplementasikan try-with-resources
pernyataan tersebut.
Contoh 1: coba-dengan-sumber daya
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()); ) ) )
Keluarkan jika file test.txt tidak ditemukan.
IOException di try-with-resources block => test.txt (Tidak ada file atau direktori seperti itu)
Keluarkan jika file test.txt ditemukan.
Memasuki blok try-with-resources Line => test line
Dalam contoh ini, kami menggunakan instance BufferedReader untuk membaca data dari test.txt
file.
Mendeklarasikan dan membuat instance BufferedReader di dalam try-with-resources
pernyataan memastikan bahwa instance-nya ditutup terlepas dari apakah try
pernyataan itu selesai secara normal atau memunculkan pengecualian.
Jika terjadi pengecualian, itu dapat ditangani dengan menggunakan blok penanganan pengecualian atau kata kunci lemparan.
Pengecualian Tersembunyi
Dalam contoh di atas, pengecualian dapat dilempar dari try-with-resources
pernyataan saat:
- File
test.txt
tidak ditemukan. - Menutup
BufferedReader
objek.
Pengecualian juga dapat dilemparkan dari try
blok karena pembacaan file dapat gagal karena berbagai alasan kapan saja.
Jika pengecualian dilempar dari try
blok dan try-with-resources
pernyataan, pengecualian dari try
blok dilemparkan dan pengecualian dari try-with-resources
pernyataan itu ditekan.
Mengambil Pengecualian yang Ditahan
Di Java 7 dan yang lebih baru, pengecualian yang disembunyikan bisa diambil dengan memanggil Throwable.getSuppressed()
metode dari pengecualian yang dilempar oleh try
blok.
Metode ini mengembalikan larik dari semua pengecualian yang disembunyikan. Kami mendapatkan pengecualian yang ditekan di catch
blok tersebut.
catch(IOException e) ( System.out.println("Thrown exception=>" + e.getMessage()); Throwable() suppressedExceptions = e.getSuppressed(); for (int i=0; i" + suppressedExceptions(i)); ) )
Keuntungan menggunakan try-with-resources
Berikut adalah keuntungan menggunakan try-with-resources:
1. akhirnya blok tidak diperlukan untuk menutup sumber daya
Sebelum Java 7 memperkenalkan fitur ini, kami harus menggunakan finally
blok tersebut untuk memastikan bahwa sumber daya ditutup untuk menghindari kebocoran sumber daya.
Berikut adalah program yang mirip dengan Contoh 1 . Namun, dalam program ini, kami akhirnya menggunakan blokir untuk menutup sumber daya.
Contoh 2: Tutup sumber daya menggunakan blok terakhir
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()); ) ) ) )
Keluaran
Memasuki blok percobaan Baris => baris dari file test.txt Memasuki blok terakhir
Seperti yang dapat kita lihat dari contoh di atas, penggunaan finally
blok untuk membersihkan sumber daya membuat kode menjadi lebih kompleks.
Perhatikan try… catch
blok di finally
blok itu juga? Ini karena an IOException
juga bisa terjadi saat menutup BufferedReader
instance di dalam finally
blok ini sehingga juga ditangkap dan ditangani.
The try-with-resources
pernyataan tidak pengelolaan sumber daya otomatis . Kita tidak perlu menutup resource secara eksplisit karena JVM menutupnya secara otomatis. Ini membuat kode lebih mudah dibaca dan lebih mudah ditulis.
2. coba dengan sumber daya dengan banyak sumber daya
Kita dapat mendeklarasikan lebih dari satu resource dalam try-with-resources
pernyataan tersebut dengan memisahkannya menggunakan titik koma;
Contoh 3: coba dengan banyak sumber daya
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()); ) ) ) )
Jika program ini dijalankan tanpa menghasilkan pengecualian apa pun, Scanner
objek membaca baris dari testRead.txt
file dan menulisnya di testWrite.txt
file baru .
Ketika beberapa deklarasi dibuat, try-with-resources
pernyataan menutup sumber daya ini dalam urutan terbalik. Dalam contoh ini, PrintWriter
objek ditutup terlebih dahulu, kemudian Scanner
objek ditutup.
Peningkatan coba-dengan-sumber daya Java 9
Di Java 7, ada batasan pada try-with-resources
pernyataan tersebut. Sumber daya harus dideklarasikan secara lokal di dalam bloknya.
try (Scanner scanner = new Scanner(new File("testRead.txt"))) ( // code )
Jika kita mendeklarasikan sumber daya di luar blok di Java 7, itu akan menghasilkan pesan kesalahan.
Scanner scanner = new Scanner(new File("testRead.txt")); try (scanner) ( // code )
Untuk mengatasi kesalahan ini, Java 9 memperbaiki try-with-resources
pernyataan tersebut sehingga referensi sumber daya dapat digunakan meskipun tidak dideklarasikan secara lokal. Kode di atas sekarang akan dijalankan tanpa kesalahan kompilasi.