Final: Nonaktifkan sakelar polimorfik ~
Ubah Variabel: Variabel tidak dapat diubah
Ubah Kelas: Kelas tidak dapat diwariskan
Metode Modifikasi: Metode tidak dapat ditulis ulang
Akhirnya: Blok pernyataan terakhir yang digunakan dalam pemrosesan pengecualian
Apakah pengecualian dihasilkan atau tidak, itu harus dieksekusi ~~~
Kode Java
kelas akhir publik akhirnya {public static void main (string [] args) {coba {lempar nullpointerException baru (); } catch (nullpointerException e) {System.out.println ("Program melempar pengecualian"); } akhirnya {System.out.println ("Blok pernyataan akhirnya dieksekusi"); }}}Penggunaan kata kunci akhirnya di java
Dibandingkan dengan model bahasa lainnya, kata kunci akhirnya adalah tambahan terbaik untuk model penanganan pengecualian Java. Struktur akhirnya memungkinkan kode untuk selalu mengeksekusi terlepas dari apakah pengecualian terjadi. Gunakan akhirnya untuk mempertahankan keadaan internal suatu objek dan untuk membersihkan sumber daya non-memori. Tanpa akhirnya kode Anda akan membingungkan. Misalnya, kode berikut menggambarkan bagaimana Anda harus menulis kode untuk membebaskan sumber daya non-memori tanpa menggunakan akhirnya:
impor java.net.*; impor java.io.*; kelas tanpa final {public void foo () melempar ioException {// Buat soket pada server port gratis ss = server baru (0); coba {socket socket = ss.accept (); // kode lain di sini ...} catch (ioException e) {ss.close (); // 1 lempar e; } // ... ss.close (); // 2}}Kode ini membuat soket dan memanggil metode penerimaan. Sebelum keluar dari metode ini, Anda harus menutup soket ini untuk menghindari kerentanan sumber daya. Untuk menyelesaikan tugas ini, kami menelepon dekat pada // 2, yang merupakan pernyataan terakhir dari metode ini. Tetapi apa yang terjadi jika pengecualian terjadi di blok coba? Dalam hal ini, panggilan dekat di // 2 tidak pernah terjadi. Karena itu, Anda harus menangkap pengecualian ini dan memasukkan panggilan lain untuk menutup pada // 1 sebelum menerbitkan kembali pengecualian ini. Ini memastikan bahwa soket ditutup sebelum keluar dari metode ini.
Menulis kode seperti ini rumit dan rentan kesalahan, tetapi akhirnya penting tanpa akhirnya. Sayangnya, dalam bahasa tanpa mekanisme akhirnya, programmer mungkin lupa untuk mengatur kode mereka dengan cara ini, menghasilkan kerentanan sumber daya. Klausa akhirnya di Java memecahkan masalah ini. Dengan akhirnya, kode sebelumnya dapat ditulis ulang ke bentuk berikut:
impor java.net.*; Impor java.io.*; kelas dengan finally {public void foo2 () melempar ioException {// Buat soket pada server port gratis ss = server baru (0); coba {socket socket = ss.accept (); // kode lain di sini ...} akhirnya {ss.close (); }}}Blok akhirnya memastikan bahwa metode dekat selalu dieksekusi terlepas dari apakah pengecualian dikeluarkan dalam blok coba. Oleh karena itu, dipastikan bahwa metode dekat selalu dipanggil sebelum keluar dari metode. Dengan cara ini Anda dapat yakin bahwa soket ditutup dan Anda belum bocor sumber daya. Tidak perlu untuk blok tangkapan lain dalam metode ini. Blok tangkapan disediakan dalam contoh pertama hanya untuk menutup soket, sekarang ini ditutup pada akhirnya. Jika Anda memberikan blok tangkapan, kode di blok akhirnya dieksekusi setelah blok tangkapan selesai.
Blok akhirnya harus digunakan dengan blok coba coba atau coba/tangkap. Selain itu, tidak mungkin untuk keluar dari blok mencoba tanpa menjalankan blok akhirnya. Jika blok akhirnya ada, itu akan selalu dieksekusi. (Pernyataan ini benar dari sudut pandang itu. Ada cara untuk keluar dari blok coba tanpa menjalankan blok akhirnya. Jika kode mengeksekusi sistem.