`

java多线程中unchecked 异常的处理UncaughtExceptionHandler

 
阅读更多
 

java多线程中unchecked 异常的处理UncaughtExceptionHandler

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

 

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

 

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

 

[java] view plaincopy
 
  1. package demo;  
  2.   
  3. import java.lang.Thread.UncaughtExceptionHandler;  
  4.   
  5. public class ThreadTest  
  6. {  
  7.     public static void main(String[] args)  
  8.     {  
  9.         ThreadA a = null;  
  10.         try  
  11.         {  
  12.             ErrHandler handle = new ErrHandler();  
  13.             a = new ThreadA();  
  14.             a.setUncaughtExceptionHandler(handle);// 加入定义的ErrHandler  
  15.             a.start(); // 线程的run抛出的RuntimeException异常无法抓到  
  16.             // a.run(); 普通方法抛出RuntimeException异常可以抓到  
  17.         }  
  18.         catch (Exception e)  
  19.         {  
  20.             System.out.println("catch RunTimeException a"); // 不起作用,但是Exception已经交给handle处理  
  21.         }  
  22.   
  23.         // 普通线程即使使用try...catch也无法捕获到抛出的异常  
  24.         try  
  25.         {  
  26.             ThreadB b = new ThreadB();  
  27.             b.start();  
  28.         }  
  29.         catch (Exception e)  
  30.         {  
  31.             System.out.println("catch RunTimeException b"); // 不起作用  
  32.         }  
  33.     }  
  34.   
  35. }  
  36.   
  37. /** 
  38.  * 自定义的一个UncaughtExceptionHandler 
  39.  */  
  40. class ErrHandler implements UncaughtExceptionHandler  
  41. {  
  42.     /** 
  43.      * 这里可以做任何针对异常的处理,比如记录日志等等 
  44.      */  
  45.     public void uncaughtException(Thread a, Throwable e)  
  46.     {  
  47.         System.out.println("This is:" + a.getName() + ",Message:" + e.getMessage());  
  48.         e.printStackTrace();  
  49.     }  
  50. }  
  51.   
  52. /** 
  53.  * 拥有UncaughtExceptionHandler的线程 
  54.  */  
  55. class ThreadA extends Thread  
  56. {  
  57.     public ThreadA()  
  58.     {  
  59.     }  
  60.   
  61.     public void run()  
  62.     {  
  63.         double i = 12 / 0;// 抛出ArithmeticException的RuntimeException型异常  
  64.     }  
  65. }  
  66.   
  67. /** 
  68.  * 普通线程 
  69.  */  
  70. class ThreadB extends Thread  
  71. {  
  72.     public ThreadB()  
  73.     {  
  74.     }  
  75.   
  76.     public void run()  
  77.     {  
  78.         try  
  79.         {  
  80.             double i = 12 / 0;// 抛出ArithmeticException的RuntimeException型异常  
  81.         }  
  82.         catch (RuntimeException e)  
  83.         {  
  84.             throw e;  
  85.         }  
  86.     }  
  87. }  
分享到:
评论

相关推荐

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

    Java中的异常处理机制是一种用于捕获和处理程序运行过程中可能出现的异常情况的机制。当程序执行过程中出现异常时,异常处理机制允许我们捕获和处理这些异常,以便程序能够以一种可控的方式处理错误情况。 Java中的...

    Java的checked和unchecked异常

     简单地讲,checked是可以在执行过程中恢复的,而unchecked异常则是无法处理的错误。  checked异常:  表示无效,不是程序中可以预测的。比如无效的用户输入,文件不存在,网络或者数据库链接错误。这些都是...

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

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

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

    7.2 异常与异常类 7.2.1 Java异常体系结构 Java中的异常有很多类型,包括在Java API中已经被定义的异常(也称系统异常)和用户自定义异常。所有的异常类都直接或间接继承了Throwable类。Throwable类是Object类的...

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

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

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

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

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

    在try块中放置可能抛出异常的代码,在catch块中处理捕获到的异常,而finally块中的代码总是会被执行,无论是否发生异常。 异常类型: Java中的异常分为已检查异常(checked exception)和未检查异常(unchecked ...

    JAVA异常基础入门

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

    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为系统异常和普通异常提供了不同的解决方案,编译器强制普通异常必须try..catch处理或用throws声明继续抛给上层调用方法处理,所以普通异常也称为checked异常,而系统异常可以处理也可以不处理,所以,编译器不...

    Java异常处理的最佳实践

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

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

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

    java异常与日志课程2.docx

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

    java 面试常见问题整理

    泛型 Java 泛型了解么?什么是类型擦除?介绍一下常用的通配符?...Java 序列化中如果有些字段不想进行序列化,怎么办? 获取用键盘输入常用的两种方法 Java 中 IO 流分为几种? 既然有了字节流,为什么还要有字符流?

    AIC的Java课程1-6章

     理解和应用Java异常,常用类,IO,集合和多线程等开发技术。  课时安排  总学时:52学时  授课:48学时 (含约20学时实验)  考试:4学时  预备知识  了解和使用操作系统,...

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

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

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

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

    java除去类里面的黄色警告

    java除去类里面的黄色警告

Global site tag (gtag.js) - Google Analytics