Java如何捕获线程异常

首先,我们要知道,在Java中,线程中的异常是不能抛出到调用该线程的外部方法中捕获的。

为什么不能抛出到外部线程捕获?

因为线程是独立执行的代码片断,线程的问题应该由线程自己来解决,而不要委托到外部。”基于这样的设计理念,在Java中,

线程方法的异常都应该在线程代码边界之内(run方法内)进行try catch并处理掉.换句话说,我们不能捕获从线程中逃逸的异常。

怎么进行的限制?

通过java.lang.Runnable.run()方法声明(因为此方法声明上没有throw exception部分)进行了约束。

如果在线程中抛出了线程会怎么样?

线程会立即终结。

现在我们可以怎样捕获线程中的异常?

JDK5之后有了一个Thread.UncaughtExceptionHandler 新接口,它允许我们在每一个Thread对象上添加一个异常处理器。Thread.UncaughtExceptionHandler.uncaughtException()方法会在线程因未捕获的异常而面临死亡时被调用。

我们该怎么使用啊??

首先我们要先定义这个线程异常捕获的处理器

1. public class MyUnchecckedExceptionhandler implements UncaughtExceptionHandler {  
2.    @Override  
3.    public void uncaughtException(Thread t, Throwable e) {  
4.      System.out.println("捕获异常处理方法:" + e);  
5.    }  
6.  }

我们有三种方式使用该线程异常捕获器:

1、在创建线程的时候进行设置

1.  Thread t = new Thread(new ExceptionThread());  
2.  t.setUncaughtExceptionHandler(new MyUnchecckedExceptionhandler());  
3.  t.start();  

2、使用Executors创建线程时,还可以在TreadFactory中设置

1.  ExecutorService exec = Executors.newCachedThreadPool(new ThreadFactory(){  
2.  @Override  
3.  public Thread newThread(Runnable r) {  
4.  Thread thread = newThread(r);  
5.  thread.setUncaughtExceptionHandler(new MyUnchecckedExceptionhandler());  
6.  return thread;  
7.  }  
8.  });  
9.  exec.execute(new ExceptionThread());  

3、如果我们只需要一个线程异常处理器处理线程的异常,那么我们可以设置一个默认的线程异常捕获器,当线程出现异常时,

  如果我们没有指定线程的异常捕获器,而且线程组也没有设置(线程组不用考虑,因为这是一个不成功的尝试),那么就会使用

默认的线程异常捕获器。

1.  // 设置默认的线程异常捕获处理器  
2.  Thread.setDefaultUncaughtExceptionHandler(new MyUnchecckedExceptionhandler());  

通过以上方法就可以捕获并处理线程的异常了。

转:https://blog.csdn.net/qq_30698633/article/details/77046829

你可能感兴趣的:(Java如何捕获线程异常)