Java线程组中未处理异常实例如何进行深入分析?
- 内容介绍
- 文章标签
- 相关推荐
本文共计578个文字,预计阅读时间需要3分钟。
本示例介绍了Java线程组与未处理的异常。自JDK 1.5起,Java加强了线程的异常处理,若线程执行过程中抛出未处理的异常,JVM将在结束线程时捕获该异常。
本文实例讲述了Java线程组与未处理异常。分享给大家供大家参考,具体如下:
一 点睛
从JDK1.5开始,Java加强了线程的异常处理,如果线程执行过程中抛出了一个未处理的异常,JVM在结束该线程之前会自动查找是否有对应的Thread.UncaughtExceptionHandler对象,如果找到该处理器对象,将会调用该对象的uncaughtException(Thread t, Throwable e)方法来处理该异常。
Thread.UncaughtExceptionHandler是Thread类的一个内部公共静态接口,该接口内只有一个方法:void uncaughtException(Thread t, Throwable e),该方法中的t代表出现异常的线程,而e代表该线程抛出的异常。
线程组处理异常的默认流程:
1 如果该线程组有父线程组,则调用父线程组的uncaughtException方法来处理该异常。
2 如果该线程实例所属的线程类有默认的异常处理器(由setDefaultUncaughtExceptionHandler方法设置的异常处理器),那就调用该异常处理器来处理该异常。
3 如果该异常对象是ThreadDeath的对象,将不做任何处理;否则将异常跟踪栈的信息打印到System.err错误输出流,并结束该线程。
二 实战
1 代码
// 定义自己的异常处理器 class MyExHandler implements Thread.UncaughtExceptionHandler { // 实现uncaughtException方法,该方法将处理线程的未处理异常 public void uncaughtException(Thread t, Throwable e) { System.out.println(t + " 线程出现了异常:" + e); } } public class ExHandler { public static void main(String[] args) { // 设置主线程的异常处理器 Thread.currentThread().setUncaughtExceptionHandler (new MyExHandler()); int a = 5 / 0; // ① System.out.println("程序正常结束!"); } }
2 运行
Thread[main,5,main] 线程出现了异常:java.lang.ArithmeticException: / by zero
3 说明
程序指定的异常处理器对未捕获的异常进行了处理,但程序依然不会正常结束。这说明异常处理器与通过catch捕获异常是不同的——当使用catch捕获异常时,异常不会向上传递给上一级调用者,但使用异常处理器对异常进行处理之后,异常依然会传递给上一级调用者。
更多java相关内容感兴趣的读者可查看本站专题:《Java进程与线程操作技巧总结》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
本文共计578个文字,预计阅读时间需要3分钟。
本示例介绍了Java线程组与未处理的异常。自JDK 1.5起,Java加强了线程的异常处理,若线程执行过程中抛出未处理的异常,JVM将在结束线程时捕获该异常。
本文实例讲述了Java线程组与未处理异常。分享给大家供大家参考,具体如下:
一 点睛
从JDK1.5开始,Java加强了线程的异常处理,如果线程执行过程中抛出了一个未处理的异常,JVM在结束该线程之前会自动查找是否有对应的Thread.UncaughtExceptionHandler对象,如果找到该处理器对象,将会调用该对象的uncaughtException(Thread t, Throwable e)方法来处理该异常。
Thread.UncaughtExceptionHandler是Thread类的一个内部公共静态接口,该接口内只有一个方法:void uncaughtException(Thread t, Throwable e),该方法中的t代表出现异常的线程,而e代表该线程抛出的异常。
线程组处理异常的默认流程:
1 如果该线程组有父线程组,则调用父线程组的uncaughtException方法来处理该异常。
2 如果该线程实例所属的线程类有默认的异常处理器(由setDefaultUncaughtExceptionHandler方法设置的异常处理器),那就调用该异常处理器来处理该异常。
3 如果该异常对象是ThreadDeath的对象,将不做任何处理;否则将异常跟踪栈的信息打印到System.err错误输出流,并结束该线程。
二 实战
1 代码
// 定义自己的异常处理器 class MyExHandler implements Thread.UncaughtExceptionHandler { // 实现uncaughtException方法,该方法将处理线程的未处理异常 public void uncaughtException(Thread t, Throwable e) { System.out.println(t + " 线程出现了异常:" + e); } } public class ExHandler { public static void main(String[] args) { // 设置主线程的异常处理器 Thread.currentThread().setUncaughtExceptionHandler (new MyExHandler()); int a = 5 / 0; // ① System.out.println("程序正常结束!"); } }
2 运行
Thread[main,5,main] 线程出现了异常:java.lang.ArithmeticException: / by zero
3 说明
程序指定的异常处理器对未捕获的异常进行了处理,但程序依然不会正常结束。这说明异常处理器与通过catch捕获异常是不同的——当使用catch捕获异常时,异常不会向上传递给上一级调用者,但使用异常处理器对异常进行处理之后,异常依然会传递给上一级调用者。
更多java相关内容感兴趣的读者可查看本站专题:《Java进程与线程操作技巧总结》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。

