Pengendali Pengecualian Global Java

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan menumpukan perhatian pada Pengendali Pengecualian Global di Java. Kami akan membincangkan asas pengecualian dan pengendalian pengecualian terlebih dahulu. Kemudian kita akan melihat secara menyeluruh mengenai pengendali pengecualian global.

Untuk mengetahui lebih lanjut mengenai pengecualian secara umum, lihat Pengecualian Pengecualian di Java.

2. Apakah Pengecualian?

Pengecualian adalah keadaan tidak normal yang timbul dalam urutan kod pada waktu runtime atau pada waktu kompilasi. Keadaan tidak normal ini timbul apabila program melanggar batasan semantik bahasa pengaturcaraan Java.

Pengecualian yang berlaku semasa waktu penyusunan diperiksa pengecualian . Pengecualian ini adalah subkelas langsung dari kelas Pengecualian , dan perlu untuk menangani pengecualian ini dalam kod.

Jenis pengecualian lain adalah pengecualian yang tidak dicentang . Penyusun tidak memeriksa pengecualian ini semasa waktu penyusunan. Pengecualian ini adalah subkelas langsung dari kelas RuntimeException yang meluaskan kelas Pengecualian .

Juga, tidak perlu menangani pengecualian runtime dalam kod.

3. Pengendali Pengecualian

Java adalah bahasa pengaturcaraan yang mantap. Salah satu ciri utama yang menjadikannya kukuh adalah kerangka pengendalian pengecualian. Ini bermaksud program dapat keluar dengan anggun pada saat-saat kesalahan, dan bukan hanya terhempas.

Setiap kali berlaku pengecualian, objek E xception dibina , baik dengan JVM atau dengan kaedah yang melaksanakan kod tersebut. Objek ini mengandungi maklumat mengenai pengecualian. Pengendalian pengecualian adalah cara menangani objek Pengecualian ini .

3.1. Yang cuba-tangkapan Block

Dalam contoh berikut, blok percubaan mengandungi kod yang dapat membuang pengecualian. The catch blok mengandungi logik untuk mengendalikan pengecualian ini.

The catch blok menangkap Pengecualian objek yang kod di dalam cuba menimbulkan blok:

String string = "01, , 2010"; DateFormat format = new SimpleDateFormat("MM, dd, yyyy"); Date date; try { date = format.parse(string); } catch (ParseException e) { System.out.println("ParseException caught!"); }

3.2. Yang membuang dan melemparkan Kata Kunci

Sebagai alternatif, kaedah ini juga boleh memilih untuk membuang pengecualian daripada mengatasinya. Itu bermaksud logik untuk menangani objek Pengecualian ditulis di tempat lain.

Biasanya, kaedah memanggil menangani pengecualian dalam kes seperti:

public class ExceptionHandler { public static void main(String[] args) { String strDate = "01, , 2010"; String dateFormat = "MM, dd, yyyy"; try { Date date = new DateParser().getParsedDate(strDate, dateFormat); } catch (ParseException e) { System.out.println("The calling method caught ParseException!"); } } } class DateParser { public Date getParsedDate(String strDate, String dateFormat) throws ParseException { DateFormat format = new SimpleDateFormat(dateFormat); try { return format.parse(strDate); } catch (ParseException parseException) { throw parseException; } } }

Seterusnya, kami akan menganggap Pengendali Pengecualian Global, sebagai cara umum untuk menangani pengecualian.

4. Penangan Pengecualian Global

Contoh RuntimeException adalah pilihan untuk dikendalikan. Akibatnya, ia masih membiarkan tingkap terbuka untuk mendapatkan jejak timbunan yang panjang pada waktu runtime. Untuk menangani ini, Java menyediakan antara muka UncaughtExceptionHandler . The Thread kelas mengandungi ini sebagai satu kelas dalam.

Selain daripada antara muka ini, Java 1.5 pelepasan juga memperkenalkan statik kaedah setDefaultUncaughtExceptionHandler () dalam Thread kelas . Hujah kaedah ini adalah kelas pengendali yang menerapkan antara muka UncaughtExceptionHandler .

Selanjutnya, antara muka ini menyatakan kaedah tidak tertangkapException (Thread t, Throwable e) . Ia akan dipanggil apabila benang yang diberi t berakhir kerana pengecualian yang tidak dapat ditanggung e . Kelas pelaksana menerapkan kaedah ini dan menentukan logik untuk menangani pengecualian yang tidak dapat dicapai ini.

Mari pertimbangkan contoh berikut yang melemparkan ArithmeticException pada waktu runtime. Kita menentukan kelas Handler yang melaksanakan antara muka UncaughtExceptionHandler .

Kelas ini menerapkan kaedah uncaughtException () dan mentakrifkan logik untuk menangani pengecualian yang tidak tertangkap di dalamnya:

public class GlobalExceptionHandler { public static void main(String[] args) { Handler globalExceptionHandler = new Handler(); Thread.setDefaultUncaughtExceptionHandler(globalExceptionHandler); new GlobalExceptionHandler().performArithmeticOperation(10, 0); } public int performArithmeticOperation(int num1, int num2) { return num1/num2; } } class Handler implements Thread.UncaughtExceptionHandler { private static Logger LOGGER = LoggerFactory.getLogger(Handler.class); public void uncaughtException(Thread t, Throwable e) { LOGGER.info("Unhandled exception caught!"); } }

Di sini, utas yang sedang dilaksanakan adalah utas utama. Oleh itu, contohnya diteruskan ke kaedah uncaughtException () bersama dengan pengecualian yang dibangkitkan. Pengendali kelas kemudian menangani pengecualian ini.

Perkara yang sama berlaku untuk pengecualian yang tidak dikendalikan. Mari lihat contoh ringkas ini juga:

public static void main(String[] args) throws Exception { Handler globalExceptionHandler = new Handler(); Thread.setDefaultUncaughtExceptionHandler(globalExceptionHandler); Path file = Paths.get(""); Files.delete(file); }

Di sini, kaedah Files.delete () melemparkan IOException yang diperiksa , yang kemudian dilemparkan oleh tanda () kaedah utama. The Handler akan menangkap pengecualian ini juga.

Dengan cara ini, UncaughtExceptionHandler membantu menguruskan pengecualian yang tidak ditangani pada waktu runtime. Namun, ini mematahkan idea untuk menangkap dan menangani pengecualian yang hampir dengan titik asal .

5. Kesimpulan

Dalam artikel ini, kami meluangkan masa untuk memahami apa pengecualiannya, dan apakah cara asas untuk mengatasinya. Juga, kami mengenal pasti bahawa pengendali pengecualian global adalah bahagian dari kelas Thread dan ia menangani pengecualian runtime yang belum selesai.

Kemudian, kami melihat contoh program yang membuang pengecualian runtime dan mengatasinya menggunakan pengendali pengecualian global.

Contoh kod untuk artikel ini boleh didapati di GitHub.