之前有同事說他的程式里的執行緒時常莫名退出,日志中沒有任何例外資訊,
目前我知道的可以獲取執行緒例外資訊的方法主要有
1、Future<?>和ScheduledFuture<?>的get()方法

2、JAVA1.5之后支持的UncaughtExceptionHandler
1 Thread thread = new Thread(() -> {run方法內的代碼塊}); 2 thread.start(); 3 thread.setUncaughtExceptionHandler((t, e) -> { 4 Logger.error(t.getName() + " ERROR\t" + e.getMessage()); 5 });
() -> {}是java1.8新特性中的lambda運算式
--------------------------------------------------------------------------------------------------------------------------------------------------------
然而,程式運行中可能會有不可預知錯誤,比如OOM(記憶體溢位)等系統錯誤,這種錯誤在java中屬于Error類,我們常用的都是Exception的子類,是捕獲不到這種例外的,
先看看一下java中例外的類圖:

RunTimeException是運行時例外,在編譯時不會被發現,比如除數為0;
Error前面說了,是系統級的錯誤,與java沒關系,所以java認為不需要捕獲這種例外,因為遇到這種例外說明系統有錯誤,已經無法支持程式正常運行,程式應該終止,沒必要捕獲和處理了,
但是對于我們開發人員和維護人員來說,我們有必要知道這些錯誤的詳細資訊,來維護系統錯誤,比如,發生了OOM,我們可以看看系統里各行程占用記憶體情況,根據情況做整改,有可能是某程式代碼不合理,導致記憶體無限被占用,
Throwable就是這所有例外的父類了,
所以,我在同事的執行緒的run方法里捕獲Throwable例外來獲取例外資訊,
1 @Override 2 public void run() { 3 try { 4 ... 5 } catch (Throwable t) { 6 Logger.error("xx task error!", t); 7 } 8 }
但,據說Throwable性能不佳,所以不推薦在沒必要的地方全都使用,小生目前對這方面還沒有研究,待有所了解后再補充說明,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/148764.html
標籤:Java
