下面是測試代碼:
package test.exception;import org.junit.Test;import java.util.concurrent.Callable;import java.util.concurrent.FutureTask;/** * Created by jackie on 2017/3/4. * 測試多線程捕獲異常 */public class AnotherThreadExceptionTest { @Test public void testFutureTask() { try { FutureTask task = new FutureTask(new Callable<String>() { @Override public String call() { System.out.PRintln("aaa"); String s ="aaa"; s.equals("ll"); s.substring(5); return s; } }); task.run(); System.out.println("out: "+task.get()); }catch (Exception e ){ e.printStackTrace();//試試注釋掉這行 } }// @Test public void testThread(){ Runnable run = new Runnable() { @Override public void run() { System.out.println("begin..."); String s =null; s.equals("ll"); //這里空指針異常有時會在控制臺打印,有時不會 try{ "aaa".substring(5); }catch (Exception e){ System.out.println("線程內捕獲到異常");//有時甚至只執行這句,不執行下一句 e.printStackTrace();//這里異常也是有時能捕獲,有時捕獲不到//// throw new MyException("gg");//java線程類中不允許拋出自定義非運行時異常而不捕獲//// throw new RuntimeException();//運行時異常可以不捕獲 } } }; try { Thread t = new Thread(run,"thread-001"); //雖然可以設置捕獲未捕獲異常,然而經常捕獲不到 t.setUncaughtExceptionHandler(new MyExceptionHandler()); t.start(); }catch (Exception e){ e.printStackTrace();//這里經常捕獲不到異常 } } class MyException extends Exception{ public MyException(String message) { super(message); } } class MyExceptionHandler implements Thread.UncaughtExceptionHandler { @Override public void uncaughtException(Thread t, Throwable e) { System.out.println(t.getName()+":"+e.toString()); } }}試了下,Thread的setUncaughtExceptionHandler方法也是不可靠的,有時可以,但經常捕獲不到。而且另起Thread線程中即使使用了try-catch塊,也是不可靠的,依舊只是有時能捕獲到,經常是捕獲不到的,沒捕獲的異常也不一定會在控制臺輸出。感覺這個類真要廢棄了。而FutureTask目前沒發現有這樣的問題。
新聞熱點
疑難解答