`
coach
  • 浏览: 383446 次
  • 性别: Icon_minigender_2
  • 来自: 印度
社区版块
存档分类
最新评论

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;
        }
    }
}
分享到:
评论
2 楼 mojunbin 2012-04-22  
嗯嗯,uncaughtException这个类可以帮我们回收一些资源.
1 楼 aspnetdb 2011-03-18  
写的还挺清晰

相关推荐

    什么是Java中的异常处理机制?Java中的异常分为哪些类型?(java面试题附答案).txt

    Java中的异常分为三种类型:检查型异常(Checked Exception)、非检查型异常(Unchecked Exception)和错误(Error)。 检查型异常(Checked Exception): 这些异常在代码中必须进行显式处理,否则编译器会报错。 ...

    java 异常详解,java异常分类,创建自己的异常

    3. 处理异常:如果运行系统找遍了所有方法而没有找到合理的异常处理方法,则运行系统将终止 Java 程序的运行。 Java 异常类型可以分为以下几类: 1. 运行异常:运行异常是指 Java 程序在运行时发现的由 Java 解释...

    详解Java中的checked异常和unchecked异常区别

    主要介绍了详解Java中的checked异常和unchecked异常区别,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Java的checked和unchecked异常

    Java异常分为两种类型,checked异常和unchecked异常,另一种叫法是异常和错误。  简单地讲,checked是可以在执行过程中恢复的,而unchecked异常则是无法处理的错误。  checked异常:  表示无效,不是程序中...

    通过实例了解java checked和unchecked异常

    主要介绍了通过实例了解checked和unchecked异常,Java异常分为两种类型,checked异常和unchecked异常,另一种叫法是异常和错误。下面小编就带大家来一起学习一下吧

    《Java程序设计案例教程》教学课件07异常处理.pptx

    03 掌握使用try-catch-finally语句块捕捉并处理异常。 05 掌握设计和使用用户自定义异常。 04 掌握使用throw语句抛出异常,以及使用throws语句声明方法异常。 《Java程序设计案例教程》教学课件07异常处理全文共31...

    Java面试宝典V8.0-V001(1).pdf

    1. Java中的异常类型:Java中有两种异常类型:checked异常和unchecked异常。checked异常是编译器强制要求捕获的异常,而unchecked异常是运行时异常。 2. Java中的try-catch块:try-catch块是Java中的异常处理机制。...

    JAVA异常基础入门

    这类异常通常是由编程错误导致的,因为只有小心点,这些异常都是可以避免的,所以在编写程序时,并不要求必须使用异常处理机制来处理这类异常,所有这类异常都继承自java.lang.RuntimeException。 注意:...

    100家大公司java笔试题汇总.docx

    2. Java中的异常可以分为两种:checked exception和unchecked exception,checked exception需要在方法声明中throws,unchecked exception不需要。 3. Java中的finally块总是会被执行,哪怕try块中抛出异常也一样。 ...

    基础深化和提高-异常机制

    Java提供了try-catch-finally语句块用于捕获和处理异常。在try块中放置可能抛出异常的代码,在catch块中处理捕获到的异常,而finally块中的代码总是会被执行,无论是否发生异常。 异常类型: Java中的异常分为已...

    java多线程编程之捕获子线程异常示例

    java多线程程序中所有线程都不允许抛出未捕获的checked exception,也就是说各个线程需要自己把自己的checked exception处理掉。但是无法避免的是unchecked exception,也就是RuntimeException,当抛出异常时子线程...

    Java异常处理的最佳实践

    Java异常,大家都很熟悉。那么具体操作是怎么样的呢?下面从基础开始,带大家一块了解是怎么实践的。本文是关于Exception处理的一篇不错的文章,从Java Exception的概念介绍起,依次讲解了Exception的类型(Checked/...

    软件工程课后习题宝典

    与现实生活中的事件很相似,现实生活中的事件可以包含事件发生的时间、地点、人物、情节等信息,可以用一个对象来表示,Java使用面向对象的方式来处理异常,它把程序中发生的每个异常也都分别封装到一个对象来表示的...

    Python中处理unchecked未捕获异常实例

    对于checked exception,我们通常使用try except可以显示解决,对于unchecked 异常,其实也是提供回调或者是钩子来帮助我们处理的,我们可以在钩子里面记录崩溃栈追踪或者发送崩溃数据. 下面代码可以实现python ...

    java中异常的笔试题-java_interview_questions:发表于https://sathish2905.github.io/j

    java中异常的笔试题Java、J2EE、JSP、Servlet、Hibernate 面试问答 如果您喜欢该项目,请单击。 拉取请求受到高度赞赏。 目录 问:异常的类型有哪些? 解释 Java Exception 类的层次结构? 异常是一种错误事件,它...

    java异常与日志课程2.docx

    所有异常都是Throwable的子类,分为Error(致命异常)和Exception(非致命异常)。Error是一种非常特殊的异常类型,它的出现标识着系统发生了不可控...Exception又分为checked异常(受检异常)和unchecked异常(非受检异常)。

    同花顺java面试笔试题-java-interview-questions:java面试题

    同花顺java面试笔试题Java、J2EE、JSP、Servlet、Hibernate 面试题 如果您喜欢该项目,请单击。 拉取请求受到高度赞赏。 目录 问:异常的类型有哪些? 解释 Java Exception 类的层次结构? 异常是一种错误事件,它...

    同花顺java面试笔试题-Interview-Questions:Java面试问题

    同花顺java面试笔试题Java、J2EE、JSP、Servlet、Hibernate 面试题 如果您喜欢该项目,请单击。 拉取请求受到高度赞赏。 目录 问:异常的类型有哪些? 解释 Java Exception 类的层次结构? 异常是一种错误事件,它...

    同花顺java面试笔试题-Java-Interview:面试问题和程序

    同花顺java面试笔试题Java、J2EE、JSP、Servlet、Hibernate 面试题 如果您喜欢该项目,请单击。 拉取请求受到高度赞赏。 目录 问:异常的类型有哪些? 解释 Java Exception 类的层次结构? 异常是一种错误事件,它...

Global site tag (gtag.js) - Google Analytics