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;
- }
- }
- }
相关推荐
异常处理在多线程环境中也显得尤为重要。非检查异常(Unchecked Exceptions)在任何线程中抛出,都需要在该线程中捕获。而检查异常(Checked Exceptions)如果在线程中抛出,需在该线程或其祖先线程中捕获,否则会...
`UncaughtExceptionHandler`接口包含一个方法`uncaughtException(Thread t, Throwable e)`,该方法会在异常线程中执行,用于处理异常。这样做的好处是可以在线程的生命周期之外,也就是run方法之外,有一个集中处理...
Java 异常处理是 Java 编程语言中的一种重要机制,用于处理程序在运行时可能出现的错误或异常情况。下面是关于 Java 异常处理的习题和知识点总结: 一、Java 异常处理关键字 * Java 中用来抛出异常的关键字是 `...
在本文中,我们将详细介绍 Java 异常处理机制,包括 try、catch、finally 块、throws、throw 关键字、Exception 和 Error 类、Checked Exception 和 Unchecked Exception 等概念,并提供了多种异常处理的示例代码,...
Java中的checked异常和unchecked异常是Java语言中两种不同的异常类型,它们之间的区别是很多开发者容易混淆的。下面,我们将详细介绍checked异常和unchecked异常的概念、区别和使用场景。 一、Java的异常层次结构 ...
Java 异常处理机制是 Java 语言的重要标志之一,在程序设计过程中用来处理程序运行中的异常。Java 异常处理机制可以分为三部分:try 块、catch 块和 finally 块。try 块用于检测异常,catch 块用于捕获和处理异常,...
Java 异常处理是 Java 编程语言中一个非常重要的概念,它能够帮助开发者捕获和处理程序中出现的错误,以确保程序的稳定运行和安全。Java 平台为我们提供了丰富和完整的异常类,通过这些异常类,我们可以处理程序运行...
Java 异常是指在程序运行中出现的违背指定正常流向的事件。异常可以分为两大类:-checked 异常和 unchecked 异常。Checked 异常必须在编译时捕捉并处理,而 unchecked 异常可以在编译时忽略,但是在运行时总是会被抛...
在Java编程中,异常处理是一项极其重要的技术。异常处理能够帮助开发者优雅地处理程序运行时遇到的问题,避免程序崩溃,并提供给用户友好的反馈信息。 **什么是异常?** 异常是指在程序运行过程中发生的意外事件,...
Java 异常处理是 Java 语言中的一个关键组件,用于处理程序运行过程中的错误和异常。在 Java 中,异常处理框架是 Java 语言健壮性的一个重要体现。本文将从 Java 异常的基本概念和语法开始,讲述 Java 异常处理的...
在Java编程语言中,异常处理是一项关键特性,用于在程序执行过程中捕获并处理错误情况。这个主题,"Java异常处理体系",涉及到Java如何优雅地处理程序运行时的异常,确保程序的健壮性和稳定性。这篇博文链接(已提供...
在Java中,异常处理是通过try-catch-finally语句块来实现的,主要涉及两大类异常:编译时异常(Checked Exception)和运行时异常(Unchecked Exception)。编译时异常是Exception类及其子类,它们在编译阶段就必须被...
Java异常处理是编程中至关重要的一个环节,它用于处理程序运行过程中可能出现的错误或异常情况。在Java中,异常是一种事件,通常表示程序中的不正常状态或者错误条件。通过异常处理,开发者可以确保程序在遇到问题时...
在Java多线程编程中,正确处理异常是确保程序健壮性的重要环节。根据标题和描述,我们将讨论如何在Java中捕获子线程的异常,特别是如何处理那些未被捕获的异常,包括Checked和Unchecked异常。 首先,我们来了解一下...
Java异常处理是Java编程中一个至关重要的概念,它关乎到程序的健壮性和稳定性。在Java语言中,异常处理提供了一种机制,使得程序在遇到错误或非正常情况时能够优雅地处理问题,而不是突然崩溃。这个“java高端技术...
在Java中,异常分为两种类型:检查型异常(Checked Exceptions)和运行时异常(Unchecked Exceptions)。检查型异常通常是由外部条件(如文件未找到或网络连接失败)引起的,而运行时异常通常表示编程错误,例如空...
在 Java 程序设计中,异常处理是非常重要的一部分。异常是指程序在执行过程中出现的错误或异常情况,例如文件不存在、网络连接中断、操作数超出预定范围等。在 Java 中,异常本身作为一个对象,产生异常就是产生一个...
Java异常处理是编程中必不可少的部分,用于处理程序运行时可能出现的错误情况。异常是程序执行过程中遇到的非正常状态,可能导致程序中断。Java提供了强大的异常处理机制来确保程序的健壮性和稳定性。 1- 什么是...
在Java中,可以使用异常_chain处理多个异常。异常_chain可以将多个异常连接起来,提供更多的信息,帮助开发者更好地理解和处理异常。 Java中的异常处理机制非常重要,需要开发者认真对待。通过学习和掌握不同的异常...