Apabila bekerja dengan pengecualian di Java, adalah perkara biasa untuk mencari keperluan untuk menggunakan blok cuba-tangkap untuk mengendalikannya dan bukan hanya menyerahkan pengendaliannya kepada sesiapa yang memanggil bahagian kod ini . Walau bagaimanapun, kadangkala perlu melakukan tindakan tertentu, tidak kira sama ada pengecualian telah dilemparkan atau tidak, atau sama ada aliran pelaksanaan program berjaya diselesaikan, contohnya, menutup fail, sambungan ke pangkalan data, dsb. .
Untuk kes ini blok akhirnya digunakan. Blok ini diletakkan selepas blok tangkapan, atau bahkan selepas blok cuba jika blok tangkapan tidak digunakan. Kod yang diletakkan di dalam blok akhirnya akan dilaksanakan dalam dua senario:
Mari kita pertimbangkan kaedah bahagi yang menerima dua integer dan mengembalikan hasil pembahagian antara mereka. Ini menggunakan blok cuba-tangkap untuk mengendalikan pengecualian yang dilemparkan apabila cuba membahagi dengan sifar, serta blok akhirnya untuk mencetak mesej yang menunjukkan bahawa sumber sedang dibersihkan.
public static int divide(int a, int b) { try { return a / b; } catch (ArithmeticException e) { System.out.println("Error: " + e.getMessage()); throw e; } finally { System.out.println("Cleaning up resources..."); } }
Dengan memanggil kaedah bahagi dengan nilai 10 dan 2, output berikut akan diperoleh:
Cleaning up resources... 5
Seperti yang kita lihat, tiada pengecualian telah dilemparkan, jadi kaedah mengembalikan hasil pembahagian dan blok akhirnya dilaksanakan, walaupun output blok akhirnya ditunjukkan terlebih dahulu. Sebaliknya, jika kaedah bahagi dipanggil dengan nilai 10 dan 0, output berikut akan diperoleh:
Error: / by zero Cleaning up resources... Exception in thread "main" java.lang.ArithmeticException: / by zero ...
Dalam kes ini, pengecualian telah dilemparkan, jadi aliran pelaksanaan terganggu dan blok tangkapan telah dilaksanakan, tetapi sebelum melontar pengecualian sekali lagi, blok akhirnya telah dilaksanakan. Dalam kedua-dua contoh kita telah melihat bahawa blok akhirnya sentiasa dilaksanakan, tanpa mengira hasil yang diperolehi.
Penggunaan utama blok akhirnya adalah untuk membebaskan sumber yang telah digunakan dalam blok cuba, seperti menutup fail, sambungan pangkalan data atau sambungan rangkaian. Untuk memberi contoh ini, mari kita pertimbangkan kaedah readFile yang membaca kandungan fail dan mengembalikan baris pertama. Ini menggunakan blok cuba-tangkap untuk mengendalikan pengecualian yang dilemparkan jika fail tidak boleh dibaca, serta blok akhirnya untuk menutup fail.
public static String readFile() throws IOException { FileReader reader = null; try { reader = new FileReader("file.txt"); BufferedReader buffer = new BufferedReader(reader); return buffer.readLine(); } catch (IOException e) { System.out.println("Error: " + e.getMessage()); throw new RuntimeException(e); } finally { if (reader != null) reader.close(); } }
Sekiranya kaedah readFile dilaksanakan dan fail tidak boleh dibaca, output berikut akan diperoleh:
public static int divide(int a, int b) { try { return a / b; } catch (ArithmeticException e) { System.out.println("Error: " + e.getMessage()); throw e; } finally { System.out.println("Cleaning up resources..."); } }
Seperti yang kita dapat lihat, pengecualian telah dilemparkan, jadi aliran pelaksanaan telah terganggu dan blok tangkapan telah dilaksanakan, tetapi sebelum melontar pengecualian sekali lagi, blok akhirnya telah dilaksanakan untuk menutup fail. Sebaliknya, jika fail file.txt dicipta dengan kandungan Hello world! dan kaedah readFile dipanggil, output berikut akan diperoleh, tanpa membuang sebarang pengecualian:
Cleaning up resources... 5
Beberapa aspek yang perlu diambil kira dalam contoh ini ialah:
Penggunaan akhirnya dalam Java telah menjadi sangat biasa sehingga bahasa itu sendiri mempunyai alternatif yang membolehkan kami memudahkan pengurusan sumber, blok cuba-dengan-sumber. Blok ini bertanggungjawab untuk menutup sumber secara automatik pada akhir penggunaannya, jadi tidak perlu menggunakan blok akhirnya untuk melepaskan sumber. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa blok akhirnya masih berguna dalam kes tertentu dan kedua-dua pilihan boleh digunakan bersama.
Atas ialah kandungan terperinci Blok akhirnya di Jawa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!