Coba seperti jaringan, yang menjaring semua pengecualian yang dilemparkan oleh kode dalam coba {}, dan kemudian menyerahkan pengecualian ke kode dalam catch {} untuk diproses. Akhirnya jalankan kode di akhirnya. Terlepas dari apakah ada pengecualian dalam kode dalam mencoba, dan apakah tangkapan tangkapan menangkap pengecualian, kode di akhirnya akan dieksekusi.
Sementara prosesor preset yang disediakan oleh sistem periode eksekusi Java berguna untuk debugging, Anda biasanya ingin menangani pengecualian sendiri. Ada dua keuntungan untuk melakukan ini: pertama, memungkinkan Anda untuk memperbaiki kesalahan. Kedua, dapat mencegah program dari penghentian secara otomatis. Setiap kali terjadi kesalahan, jika program Anda berhenti dan mencetak trek tumpukan, sebagian besar pengguna akan bingung. Untungnya, Anda dapat dengan mudah menghindari situasi ini.
Untuk waspada dan berurusan dengan kesalahan periode eksekusi, cukup letakkan kode yang ingin Anda pantau di blok coba. Segera setelah blok coba, tentukan contoh pengambilan kesalahan tipe pengecualian yang ingin Anda tangkap dalam klausa tangkapan:
Coba {Code;
Misalnya:
Impor java.io.*; // Memanggil paket IO Paket Publik SimpleCharinout {public static void main (string args []) {char ch = ''; // mendefinisikan karakter ch sebagai 'system.out.prin tln (" Masukkan karakter tolong "); // buka masukkan karakter, silakan coba di layar {// silakan letakkan kode program yang ingin Anda pantau di blok coba. Segera setelah blok coba, tentukan pola pengecualian yang ingin Anda tangkap dalam klausa tangkapan ch = (char) system.in.read (); // Tetapkan karakter yang dimasukkan dari keyboard ke ch} catch (ioException e) // Jika ada kesalahan dalam kode di atas, Anda akan menangkap {} di sini; // tidak ada operasi setelah kesalahan system.out.println ("Anda dimasukkan karakter:" + ch); // output yang Anda masukkan pada Karakter layar: // dan nilai ch}}
Saat kita menulis java coba..catch, kita sering perlu menambahkan klausa akhirnya untuk menutup beberapa sumber daya, misalnya
InputStream adalah; coba {is = OpenInputStream (); // Do Something} catch (ioException e) {e.printstacetrace (e);} akhirnya {coba {isClose (); }}
Tetapi ketika menggunakan pola ini, bahkan veteran Java sesekali membuat beberapa kesalahan. Misalnya, dalam kode di atas, ketika fungsi OpenInputStream () melempar pengecualian selama eksekusi, nilai variabel masih nol. Oleh karena itu tidak dapat ditangkap oleh blok tangkapan, tetapi secara langsung dilemparkan ke lapisan panggilan. Saya pribadi berpikir bahwa cara penulisan yang lebih elegan adalah dengan secara langsung memanggil metode ioutils.CloseQuitle () yang disediakan oleh paket Commons -o untuk menutup aliran (atau merangkum metode sendiri () sendiri).
Ada keuntungan lain menggunakan metode penulisan ini, yaitu tidak mudah untuk membuat kesalahan saat menutup banyak sumber daya IO, seperti kode berikut:
InputStream adalah; outputStream os; coba {is = OpenInputStream (); // lakukan sesuatu} catch (ioException e) {e.printstacetrace (e);} akhirnya {coba {if (is! = Null) is.close () if (os! = null) os.close ();} catch (ioException e) {}}
Ketika kesalahan terjadi di is.close (), os.close () tidak dapat dieksekusi, menghasilkan sumber daya yang dirujuk oleh OS yang tidak dirilis.
Mungkin Oracle juga berpikir bahwa jenis percobaan ini ... Tangkap ... Akhirnya kode boilerplate terlalu tidak perlu, jadi saya membuat beberapa modifikasi pada klausa percobaan di JDK 7, menghilangkan penulisan beberapa kode yang secara manual menutup sumber daya, membuat kode tersebut terlihat lebih kompak dan lebih sederhana. Misalnya, kode di atas dapat diubah menjadi:
coba (inputStream adalah = OpenInputStream (); outputStream os = openOutStream ();) {// Do Something} catch (ioException e) {e.printstacetrace (e);}
Oracle menyebut pernyataan coba (..) di sini pernyataan mencoba-dengan-sumber daya. Perlu dicatat bahwa objek yang dirujuk oleh variabel dalam coba (..) harus menjadi contoh yang mengimplementasikan antarmuka java.io.autoclosable. Dengan kata lain, sumber daya dalam pernyataan cobalah dengan sumber daya tidak terbatas pada sumber daya IO.
Di sini perlu untuk memberikan beberapa penjelasan tambahan untuk beberapa detail pernyataan percobaan-dengan-sumber daya:
JDK memastikan bahwa metode tutup () dari semua sumber daya disebut terlepas dari apakah metode tutup () melempar pengecualian, dan urutan panggilan dibalik dari urutan deklarasi sumber daya.
Semua pengecualian yang dilemparkan dalam pernyataan mencoba-dengan-sumber daya akan ditangkap. Jika beberapa pengecualian dilemparkan, pengecualian selanjutnya akan ditekan. Pengecualian yang ditekan dapat diperoleh dengan memanggil getsuppressed () yang ditentukan oleh kelas yang dapat dilempar secara bergantian.
Contoh di atas,
Saat keluar dari mencoba .. Tangkap. Dalam pengecualian yang dilemparkan oleh os.close (). Anda bisa mendapatkan pengecualian yang dilemparkan oleh is.close () melalui metode getsuppressed ().
Jika IOException terjadi ketika OpenInputStream () dipanggil, maka OpenOutputStream () tidak akan dipanggil, os.close () dan is.close () tidak akan dipanggil, dan blok tangkapan menangkap lemparan saat memanggil OpenInputStream () pengecualian.
Jika terjadi IOException (ditunjukkan oleh token E1), maka IS.Close () masih akan dipanggil Pengecualian yang ditangkap oleh blok tangkapan adalah E1.
Selain merenovasi blok coba, JDK 7 juga menyederhanakan bagian tangkapan, memungkinkan beberapa klausa tangkapan untuk digabungkan. Misalnya:
coba (inputStream adalah = OpenInputStream (); outputStream os = openOutStream ();) {// lakukan sesuatu} catch (ioException | xmlparseException | xpathexception e) {e.printstacetrace (e);}
Selain itu, ketika Anda me -retweet beberapa pengecualian, Anda tidak perlu lagi mendefinisikan jenis pengecualian secara detail. Anda hanya perlu menyatakan pengecualian yang perlu dilemparkan saat metode didefinisikan. Misalnya
// Meskipun pengecualian digunakan di sini untuk mencocokkan ioException yang dilemparkan, kompiler tahu bahwa pengecualian yang benar -benar dilemparkan ke lapisan atas adalah ioException public void doio () melempar ioException {coba {lempar ioException baru ();} catc h (pengecualian e ) {throw e;
PS: Saya tidak bisa memikirkan manfaat apa pun yang akan dibawa fitur ini
JDK 7 memiliki fitur sintaks baru yang menarik lainnya, seperti literal biner, segmentasi bilangan panjang dengan garis bawah, jenis inferensi parameter generik, sakelar mendukung pencocokan string, dll. Sekarang JDK 8 telah memperkenalkan beberapa fitur yang berguna. Tanpa mempertimbangkan kompatibilitas mundur, tepat dan secara fleksibel menerapkan beberapa fitur sintaks dapat membuat kode kami tampak lebih jelas dan lebih ringkas sampai batas tertentu.