Sumber percubaan Java (Dengan Contoh)

Dalam tutorial ini, kita akan belajar mengenai pernyataan cuba-dengan-sumber untuk menutup sumber secara automatik.

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

  1. menyatakan dan menyatakan sumber dalam tryklausa.
  2. 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-resourcespenyataan 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.txtfail.

Menyatakan dan memberi contoh BufferedReader di dalam try-with-resourcespernyataan memastikan bahawa contohnya ditutup tanpa mengira sama ada trypernyataan 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-resourcespernyataan apabila:

  • Fail test.txttidak dijumpai.
  • Menutup BufferedReaderobjek.

Pengecualian juga boleh dilemparkan dari tryblok kerana pembacaan fail boleh gagal kerana banyak sebab pada bila-bila masa.

Sekiranya pengecualian dilemparkan dari kedua tryblok dan try-with-resourcespernyataan, pengecualian dari tryblok dilemparkan dan pengecualian dari try-with-resourcespenyataan 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 tryblok.

Kaedah ini mengembalikan pelbagai pengecualian yang ditindas. Kami mendapat pengecualian yang tersekat di catchblok.

 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 finallyblok 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 finallyblok untuk membersihkan sumber menjadikan kodnya lebih kompleks.

Perhatikan juga try… catchblok di finallyblok? Ini kerana IOExceptionboleh juga berlaku semasa menutup BufferedReadercontoh di dalam finallyblok ini sehingga ia juga tertangkap dan ditangani.

The try-with-resourceskenyataan 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-resourcespenyataan 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, Scannerobjek membaca baris dari testRead.txtfail dan menulisnya dalam testWrite.txtfail baru .

Apabila pelbagai deklarasi dibuat, try-with-resourcespernyataan menutup sumber-sumber ini dalam urutan terbalik. Dalam contoh ini, PrintWriterobjek ditutup terlebih dahulu dan kemudian Scannerobjek ditutup.

Peningkatan sumber daya Java 9

Di Java 7, ada batasan untuk try-with-resourcespenyataan 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-resourcespernyataan sehingga rujukan sumber dapat digunakan walaupun tidak diisytiharkan secara tempatan. Kod di atas kini akan dilaksanakan tanpa kesalahan kompilasi.

Artikel menarik...