3. Membungkus pengecualian

Pengecualian yang diperiksa tampak keren dalam teori, tetapi ternyata menjadi frustrasi besar dalam praktiknya.

Misalkan Anda memiliki metode yang sangat populer di proyek Anda. Itu dipanggil dari ratusan tempat di program Anda. Dan Anda memutuskan untuk menambahkan pengecualian baru yang diperiksa untuk itu. Dan mungkin pengecualian yang diperiksa ini sangat penting dan sangat istimewa sehingga hanya main()metode yang tahu apa yang harus dilakukan jika tertangkap.

Itu berarti Anda harus menambahkan pengecualian yang dicentang ke throwsklausa dari setiap metode yang memanggil metode super populer Anda . Serta di throwsklausa semua metode yang memanggil metode tersebut. Dan metode yang memanggil metode tersebut.

Akibatnya, throwsklausa setengah dari metode dalam proyek mendapatkan pengecualian baru yang diperiksa . Dan tentu saja proyek Anda dicakup oleh pengujian, dan sekarang pengujian tidak dapat dikompilasi. Dan sekarang Anda juga harus mengedit klausa lemparan dalam pengujian Anda.

Dan kemudian semua kode Anda (semua perubahan dalam ratusan file) harus ditinjau oleh pemrogram lain. Dan pada titik ini kami bertanya pada diri sendiri mengapa kami membuat begitu banyak perubahan berdarah pada proyek ini? Hari(s?) kerja, dan tes rusak - semua demi menambahkan satu pengecualian diperiksa ?

Dan tentu saja, masih ada masalah terkait pewarisan dan penggantian metode. Masalah yang muncul dari pengecualian yang diperiksa jauh lebih besar daripada manfaatnya. Intinya adalah sekarang hanya sedikit orang yang menyukainya dan sedikit orang yang menggunakannya.

Namun, masih banyak kode (termasuk kode pustaka Java standar) yang berisi pengecualian yang dicentang ini . Apa yang harus dilakukan dengan mereka? Kita tidak bisa mengabaikannya, dan kita tidak tahu bagaimana menanganinya.

Pemrogram Java mengusulkan untuk membungkus pengecualian yang diperiksa dalam RuntimeException. Dengan kata lain, tangkap semua pengecualian yang dicentang lalu buat pengecualian yang tidak dicentang (misalnya, RuntimeException) dan buang saja. Melakukannya terlihat seperti ini:

try
{
   // Code where a checked exception might occur
}
catch(Exception exp)
{
   throw new RuntimeException(exp);
}

Ini bukan solusi yang sangat bagus, tetapi tidak ada kriminal di sini: pengecualian hanya dimasukkan ke dalam file RuntimeException.

Jika diinginkan, Anda dapat dengan mudah mengambilnya dari sana. Contoh:

Kode Catatan
try
{
   // Code where we wrap the checked exception
   // in a RuntimeException
}
catch(RuntimeException e)
{
   Throwable cause = e.getCause();
   if (cause instanceof Exception)
   {
      Exception exp = (Exception) cause;
      // Exception handling code goes here
   }
}







Dapatkan pengecualian yang disimpan di dalam RuntimeExceptionobjek. Variabel causemungkin null

Menentukan jenisnya dan mengubahnya menjadi jenis pengecualian yang diperiksa .