下面是测试代码:
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目前没发现有这样的问题。
新闻热点
疑难解答