`

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多线程编程实战指南-核心篇

    异常处理在多线程环境中也显得尤为重要。非检查异常(Unchecked Exceptions)在任何线程中抛出,都需要在该线程中捕获。而检查异常(Checked Exceptions)如果在线程中抛出,需在该线程或其祖先线程中捕获,否则会...

    java多线程中的异常处理机制简析

    `UncaughtExceptionHandler`接口包含一个方法`uncaughtException(Thread t, Throwable e)`,该方法会在异常线程中执行,用于处理异常。这样做的好处是可以在线程的生命周期之外,也就是run方法之外,有一个集中处理...

    java异常处理习题

    Java 异常处理是 Java 编程语言中的一种重要机制,用于处理程序在运行时可能出现的错误或异常情况。下面是关于 Java 异常处理的习题和知识点总结: 一、Java 异常处理关键字 * Java 中用来抛出异常的关键字是 `...

    Java常见工具类及异常处理

    在本文中,我们将详细介绍 Java 异常处理机制,包括 try、catch、finally 块、throws、throw 关键字、Exception 和 Error 类、Checked Exception 和 Unchecked Exception 等概念,并提供了多种异常处理的示例代码,...

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

    Java中的checked异常和unchecked异常是Java语言中两种不同的异常类型,它们之间的区别是很多开发者容易混淆的。下面,我们将详细介绍checked异常和unchecked异常的概念、区别和使用场景。 一、Java的异常层次结构 ...

    Java异常处理策略研究.pdf

    Java 异常处理机制是 Java 语言的重要标志之一,在程序设计过程中用来处理程序运行中的异常。Java 异常处理机制可以分为三部分:try 块、catch 块和 finally 块。try 块用于检测异常,catch 块用于捕获和处理异常,...

    Java异常处理与自定义异常.pdf

    Java 异常处理是 Java 编程语言中一个非常重要的概念,它能够帮助开发者捕获和处理程序中出现的错误,以确保程序的稳定运行和安全。Java 平台为我们提供了丰富和完整的异常类,通过这些异常类,我们可以处理程序运行...

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

    Java 异常是指在程序运行中出现的违背指定正常流向的事件。异常可以分为两大类:-checked 异常和 unchecked 异常。Checked 异常必须在编译时捕捉并处理,而 unchecked 异常可以在编译时忽略,但是在运行时总是会被抛...

    Java异常处理总结

    在Java编程中,异常处理是一项极其重要的技术。异常处理能够帮助开发者优雅地处理程序运行时遇到的问题,避免程序崩溃,并提供给用户友好的反馈信息。 **什么是异常?** 异常是指在程序运行过程中发生的意外事件,...

    高效的java异常处理框架高效的java异常处理框架高效的java异常处理框架

    Java 异常处理是 Java 语言中的一个关键组件,用于处理程序运行过程中的错误和异常。在 Java 中,异常处理框架是 Java 语言健壮性的一个重要体现。本文将从 Java 异常的基本概念和语法开始,讲述 Java 异常处理的...

    Java异常处理体系

    在Java编程语言中,异常处理是一项关键特性,用于在程序执行过程中捕获并处理错误情况。这个主题,"Java异常处理体系",涉及到Java如何优雅地处理程序运行时的异常,确保程序的健壮性和稳定性。这篇博文链接(已提供...

    Java异常处理终结篇——如何进行Java异常处理设计 - 望远的个人页面 - 开源中国社区1

    在Java中,异常处理是通过try-catch-finally语句块来实现的,主要涉及两大类异常:编译时异常(Checked Exception)和运行时异常(Unchecked Exception)。编译时异常是Exception类及其子类,它们在编译阶段就必须被...

    实验六:Java异常处理

    Java异常处理是编程中至关重要的一个环节,它用于处理程序运行过程中可能出现的错误或异常情况。在Java中,异常是一种事件,通常表示程序中的不正常状态或者错误条件。通过异常处理,开发者可以确保程序在遇到问题时...

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

    在Java多线程编程中,正确处理异常是确保程序健壮性的重要环节。根据标题和描述,我们将讨论如何在Java中捕获子线程的异常,特别是如何处理那些未被捕获的异常,包括Checked和Unchecked异常。 首先,我们来了解一下...

    java高端技术课程--Java异常处理详解

    Java异常处理是Java编程中一个至关重要的概念,它关乎到程序的健壮性和稳定性。在Java语言中,异常处理提供了一种机制,使得程序在遇到错误或非正常情况时能够优雅地处理问题,而不是突然崩溃。这个“java高端技术...

    java试验报告之异常处理程序设计

    在Java中,异常分为两种类型:检查型异常(Checked Exceptions)和运行时异常(Unchecked Exceptions)。检查型异常通常是由外部条件(如文件未找到或网络连接失败)引起的,而运行时异常通常表示编程错误,例如空...

    Java程序设计 7 异常处理.pptx

    在 Java 程序设计中,异常处理是非常重要的一部分。异常是指程序在执行过程中出现的错误或异常情况,例如文件不存在、网络连接中断、操作数超出预定范围等。在 Java 中,异常本身作为一个对象,产生异常就是产生一个...

    Java异常处理-异常处理概述与常见异常举例

    Java异常处理是编程中必不可少的部分,用于处理程序运行时可能出现的错误情况。异常是程序执行过程中遇到的非正常状态,可能导致程序中断。Java提供了强大的异常处理机制来确保程序的健壮性和稳定性。 1- 什么是...

    Java编程异常处理最佳实践【推荐】

    在Java中,可以使用异常_chain处理多个异常。异常_chain可以将多个异常连接起来,提供更多的信息,帮助开发者更好地理解和处理异常。 Java中的异常处理机制非常重要,需要开发者认真对待。通过学习和掌握不同的异常...

Global site tag (gtag.js) - Google Analytics