在线程中怎么处理不可控制异常

        在Java中有两种异常。
        非运行时异常(Checked Exception):这种异常必须在方法声明的throws语句指定,或者在方法体内捕获。例如:IOExceptionClassNotFoundException
运行时异常(Unchecked Exception):这种异常不必在方法声明中指定,也不需要在方法体中捕获。
        例如,NumberFormatException
        因为run()方法不支持throws语句,所以当线程对象的run()方法抛出非运行异常时,我们必须捕获并且处理它们。当运行时异常从run()方法中抛出时,默认行为是在控制台输出堆栈记录并且退出程序。
        好在,java提供给我们一种在线程对象里捕获和处理运行时异常的一种机制。实现用来处理运行时异常的类,这个类实现UncaughtExceptionHandler接口并且实现这个接口的uncaughtException()方法。示例:
package concurrency;
import java.lang.Thread.UncaughtExceptionHandler;
public class Main2 {
        public static void main(String[] args) {Task task = new Task();
                Thread thread = new Thread(task);
                thread.setUncaughtExceptionHandler(new ExceptionHandler());
                thread.start();
        }
}
class Task implements Runnable{
        @Override
        public void run() {
                int numero = Integer.parseInt("TTT");
                }
        }
class ExceptionHandler implements UncaughtExceptionHandler{
        @Override
        public void uncaughtException(Thread t, Throwable e) {
                System.out.printf("An exception has been captured\n");
                System.out.printf("Thread: %s\n", t.getId());
                System.out.printf("Exception: %s: %s\n", e.getClass().getName(),e.getMessage());
                System.out.printf("Stack Trace: \n");
                e.printStackTrace(System.out);
                System.out.printf("Thread status: %s\n",t.getState());
        }
}
        当一个线程抛出了异常并且没有被捕获时(这种情况只可能是运行时异常),JVM检查这个线程是否被预置了未捕获异常处理器。如果找到,JVM将调用线程对象的这个方法,并将线程对象和异常作为传入参数。
        Thread类还有另一个方法可以处理未捕获到的异常,即静态方法 setDefaultUncaughtExceptionHandler()。这个方法在应用程序中为所有的线程对象创建了一个异常处理器。
        当线程抛出一个未捕获到的异常时,JVM将为异常寻找以下三种可能的处理器。
               1. 首先,它查找线程对象的未捕获异常处理器。
               2. 如果找不到,JVM继续查找线程对象所在的线程组(ThreadGroup)的未捕获异常处理器。
                3.如果还是找不到,如同本节所讲的,JVM将继续查找默认的未捕获异常处理器。
                4.如果没有一个处理器存在,JVM则将堆栈异常记录打印到控制台,并退出程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值