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;
}
}
}
分享到:
相关推荐
Java中的异常分为三种类型:检查型异常(Checked Exception)、非检查型异常(Unchecked Exception)和错误(Error)。 检查型异常(Checked Exception): 这些异常在代码中必须进行显式处理,否则编译器会报错。 ...
3. 处理异常:如果运行系统找遍了所有方法而没有找到合理的异常处理方法,则运行系统将终止 Java 程序的运行。 Java 异常类型可以分为以下几类: 1. 运行异常:运行异常是指 Java 程序在运行时发现的由 Java 解释...
主要介绍了详解Java中的checked异常和unchecked异常区别,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Java异常分为两种类型,checked异常和unchecked异常,另一种叫法是异常和错误。 简单地讲,checked是可以在执行过程中恢复的,而unchecked异常则是无法处理的错误。 checked异常: 表示无效,不是程序中...
主要介绍了通过实例了解checked和unchecked异常,Java异常分为两种类型,checked异常和unchecked异常,另一种叫法是异常和错误。下面小编就带大家来一起学习一下吧
03 掌握使用try-catch-finally语句块捕捉并处理异常。 05 掌握设计和使用用户自定义异常。 04 掌握使用throw语句抛出异常,以及使用throws语句声明方法异常。 《Java程序设计案例教程》教学课件07异常处理全文共31...
1. Java中的异常类型:Java中有两种异常类型:checked异常和unchecked异常。checked异常是编译器强制要求捕获的异常,而unchecked异常是运行时异常。 2. Java中的try-catch块:try-catch块是Java中的异常处理机制。...
这类异常通常是由编程错误导致的,因为只有小心点,这些异常都是可以避免的,所以在编写程序时,并不要求必须使用异常处理机制来处理这类异常,所有这类异常都继承自java.lang.RuntimeException。 注意:...
2. Java中的异常可以分为两种:checked exception和unchecked exception,checked exception需要在方法声明中throws,unchecked exception不需要。 3. Java中的finally块总是会被执行,哪怕try块中抛出异常也一样。 ...
Java提供了try-catch-finally语句块用于捕获和处理异常。在try块中放置可能抛出异常的代码,在catch块中处理捕获到的异常,而finally块中的代码总是会被执行,无论是否发生异常。 异常类型: Java中的异常分为已...
java多线程程序中所有线程都不允许抛出未捕获的checked exception,也就是说各个线程需要自己把自己的checked exception处理掉。但是无法避免的是unchecked exception,也就是RuntimeException,当抛出异常时子线程...
Java异常,大家都很熟悉。那么具体操作是怎么样的呢?下面从基础开始,带大家一块了解是怎么实践的。本文是关于Exception处理的一篇不错的文章,从Java Exception的概念介绍起,依次讲解了Exception的类型(Checked/...
与现实生活中的事件很相似,现实生活中的事件可以包含事件发生的时间、地点、人物、情节等信息,可以用一个对象来表示,Java使用面向对象的方式来处理异常,它把程序中发生的每个异常也都分别封装到一个对象来表示的...
对于checked exception,我们通常使用try except可以显示解决,对于unchecked 异常,其实也是提供回调或者是钩子来帮助我们处理的,我们可以在钩子里面记录崩溃栈追踪或者发送崩溃数据. 下面代码可以实现python ...
java中异常的笔试题Java、J2EE、JSP、Servlet、Hibernate 面试问答 如果您喜欢该项目,请单击。 拉取请求受到高度赞赏。 目录 问:异常的类型有哪些? 解释 Java Exception 类的层次结构? 异常是一种错误事件,它...
所有异常都是Throwable的子类,分为Error(致命异常)和Exception(非致命异常)。Error是一种非常特殊的异常类型,它的出现标识着系统发生了不可控...Exception又分为checked异常(受检异常)和unchecked异常(非受检异常)。
同花顺java面试笔试题Java、J2EE、JSP、Servlet、Hibernate 面试题 如果您喜欢该项目,请单击。 拉取请求受到高度赞赏。 目录 问:异常的类型有哪些? 解释 Java Exception 类的层次结构? 异常是一种错误事件,它...
同花顺java面试笔试题Java、J2EE、JSP、Servlet、Hibernate 面试题 如果您喜欢该项目,请单击。 拉取请求受到高度赞赏。 目录 问:异常的类型有哪些? 解释 Java Exception 类的层次结构? 异常是一种错误事件,它...
同花顺java面试笔试题Java、J2EE、JSP、Servlet、Hibernate 面试题 如果您喜欢该项目,请单击。 拉取请求受到高度赞赏。 目录 问:异常的类型有哪些? 解释 Java Exception 类的层次结构? 异常是一种错误事件,它...