天天看點

如何捕獲java線程中的逃逸的異常線程在run方法抛出異常,沒有catch實作UncaughtExceptionHandler這個接口來捕獲抛出的異常在Thread類中設定一個靜态域

在java線程中,在run方法中,我們要在run()方法中,把一切的異常有處理掉,也就try-catch掉。不能讓這個線程抛出異常,因為如果我們不使用特殊的方式的話,我們是無法捕獲從這個線程中逃逸的異常的。異常一旦抛出了,那麼這個線程就會停止運作,但是不會影響主線程和其它的線程。因為主線程和其它的線程都不知道它抛出了異常。

如何捕獲java線程中的逃逸的異常線程在run方法抛出異常,沒有catch實作UncaughtExceptionHandler這個接口來捕獲抛出的異常在Thread類中設定一個靜态域

那麼會有疑問,是不是在main函數裡面沒有catch

如何捕獲java線程中的逃逸的異常線程在run方法抛出異常,沒有catch實作UncaughtExceptionHandler這個接口來捕獲抛出的異常在Thread類中設定一個靜态域

一樣是catch不到的,想想一個線程的抛出異常之後就終止了如果再進行catch,都不在一個線程裡面

是以這個時候我們得去實作uncaughtexceptionhandler這個接口來捕獲抛出的異常

如何捕獲java線程中的逃逸的異常線程在run方法抛出異常,沒有catch實作UncaughtExceptionHandler這個接口來捕獲抛出的異常在Thread類中設定一個靜态域

都能捕獲到

如果你知道将要在代碼中處處使用相同的異常處理器,那麼更加簡單的方式是在thread類中設定一個靜态域,并将這個處理器設定為預設的未捕獲異常的處理器。

如何捕獲java線程中的逃逸的異常線程在run方法抛出異常,沒有catch實作UncaughtExceptionHandler這個接口來捕獲抛出的異常在Thread類中設定一個靜态域

說明:這個處理器隻有在不存線上程專有的未捕獲異常的情況下才會被調用。系統會檢查線程的專有的版本,如果沒有發現,則檢查線程組是有有其專有的uncaughtexception()方法。如果也沒有,在調用defaultuncaughtexcept。

在java多線程程式中,所有線程都不允許抛出未捕獲的checked exception(比如sleep時的interruptedexception),也就是說各個線程需要自己把自己的checked exception處理掉。這一點是通過java.lang.runnable.run()方法聲明(因為此方法聲明上沒有throw exception部分)進行了限制。但是線程依然有可能抛出unchecked exception(如運作時異常),當此類異常跑抛出時,線程就會終結,而對于主線程和其他線程完全不受影響,且完全感覺不到某個線程抛出的異常(也是說完全無法catch到這個異常)。jvm的這種設計源自于這樣一種理念:線程是獨立執行的代碼片斷,線程的問題應該由線程自己來解決,而不要委托到外部。”“基于這樣的設計理念,在java中,線程方法的異常(無論是checked還是unchecked exception),都應該線上程代碼邊界之内(run方法内)進行try catch并處理掉.換句話說,我們不能捕獲從線程中逃逸的異常。