Mencoba-dengan-sumber daya Java (Dengan Contoh)

Dalam tutorial ini, kita akan belajar tentang pernyataan coba-dengan-sumber daya untuk menutup sumber daya secara otomatis.

The try-with-resourcespernyataan 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-resourcespernyataan dengan,

  1. mendeklarasikan dan membuat instance sumber daya dalam tryklausa.
  2. 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-resourcespernyataan 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.txtfile.

Mendeklarasikan dan membuat instance BufferedReader di dalam try-with-resourcespernyataan memastikan bahwa instance-nya ditutup terlepas dari apakah trypernyataan 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-resourcespernyataan saat:

  • File test.txttidak ditemukan.
  • Menutup BufferedReaderobjek.

Pengecualian juga dapat dilemparkan dari tryblok karena pembacaan file dapat gagal karena berbagai alasan kapan saja.

Jika pengecualian dilempar dari tryblok dan try-with-resourcespernyataan, pengecualian dari tryblok dilemparkan dan pengecualian dari try-with-resourcespernyataan 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 tryblok.

Metode ini mengembalikan larik dari semua pengecualian yang disembunyikan. Kami mendapatkan pengecualian yang ditekan di catchblok 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 finallyblok 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 finallyblok untuk membersihkan sumber daya membuat kode menjadi lebih kompleks.

Perhatikan try… catchblok di finallyblok itu juga? Ini karena an IOExceptionjuga bisa terjadi saat menutup BufferedReaderinstance di dalam finallyblok ini sehingga juga ditangkap dan ditangani.

The try-with-resourcespernyataan 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-resourcespernyataan 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, Scannerobjek membaca baris dari testRead.txtfile dan menulisnya di testWrite.txtfile baru .

Ketika beberapa deklarasi dibuat, try-with-resourcespernyataan menutup sumber daya ini dalam urutan terbalik. Dalam contoh ini, PrintWriterobjek ditutup terlebih dahulu, kemudian Scannerobjek ditutup.

Peningkatan coba-dengan-sumber daya Java 9

Di Java 7, ada batasan pada try-with-resourcespernyataan 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-resourcespernyataan tersebut sehingga referensi sumber daya dapat digunakan meskipun tidak dideklarasikan secara lokal. Kode di atas sekarang akan dijalankan tanpa kesalahan kompilasi.

Artikel yang menarik...