java线程unchecked 异常的处理UncaughtExceptionHandler

Thread的run方法是不抛出任何检查型异常(checked exception)的,但是它自身却可能因为一个异常而被终止,导致这个线程的终结。最麻烦的是,在线程中抛出的异常即使在主线程中使用try...catch也无法截获,因此可能导致一些问题出现,比如异常的时候无法回收一些系统资源,或者没有关闭当前的连接等等。

主线程之所以不处理子线程抛出的RuntimeException,是因为线程是异步的,子线程没结束,主线程可能已经结束了。

UncaughtExceptionHandler名字意味着处理未捕获的异常。更明确的说,它处理未捕获的运行时异常。Java编译器要求处理所有非运行时异常,否则程序不能编译通过。这里“处理”的是方法里throws子句声明的异常或在try-catch块里的catch子句的异常。

package demo;

import java.lang.Thread.UncaughtExceptionHandler;

public class ThreadTest
{
public static void main(String[] args)
{
ThreadA a = null;
try
{
ErrHandler handle = new ErrHandler();
a = new ThreadA();
a.setUncaughtExceptionHandler(handle);// 加入定义的ErrHandler
a.start(); // 线程的run抛出的RuntimeException异常无法抓到
// a.run(); 普通方法抛出RuntimeException异常可以抓到
}
catch (Exception e)
{
System.out.println("catch RunTimeException a"); // 不起作用,但是Exception已经交给handle处理
}

// 普通线程即使使用try...catch也无法捕获到抛出的异常
try
{
ThreadB b = new ThreadB();
b.start();
}
catch (Exception e)
{
System.out.println("catch RunTimeException b"); // 不起作用
}
}

}

/**
* 自定义的一个UncaughtExceptionHandler
*/
class ErrHandler implements UncaughtExceptionHandler
{
/**
* 这里可以做任何针对异常的处理,比如记录日志等等
*/
public void uncaughtException(Thread a, Throwable e)
{
System.out.println("This is:" + a.getName() + ",Message:" + e.getMessage());
e.printStackTrace();
}
}

/**
* 拥有UncaughtExceptionHandler的线程
*/
class ThreadA extends Thread
{
public ThreadA()
{
}

public void run()
{
double i = 12 / 0;// 抛出ArithmeticException的RuntimeException型异常
}
}

/**
* 普通线程
*/
class ThreadB extends Thread
{
public ThreadB()
{
}

public void run()
{
try
{
double i = 12 / 0;// 抛出ArithmeticException的RuntimeException型异常
}
catch (RuntimeException e)
{
throw e;
}
}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值