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;
}
}
}
分享到:
相关推荐
`UncaughtExceptionHandler`接口包含一个方法`uncaughtException(Thread t, Throwable e)`,该方法会在异常线程中执行,用于处理异常。这样做的好处是可以在线程的生命周期之外,也就是run方法之外,有一个集中处理...
在Java子线程中处理异常是一个非常重要的主题,因为在并发情况下,捕获和处理异常变得更加复杂。本文将探讨如何在父线程中捕获来自子线程的异常,并提供三种常用方法来解决这个问题。 问题分析 在普通的单线程程序...
在Java多线程编程中,正确处理异常是确保程序健壮性的重要环节。根据标题和描述,我们将讨论如何在Java中捕获子线程的异常,特别是如何处理那些未被捕获的异常,包括Checked和Unchecked异常。 首先,我们来了解一下...
对于AsyncTask、Handler、Runnable等异步任务,需要在代码中显式捕获并处理异常。 在实际项目中,我们通常会结合使用CrashReport工具(如Crashlytics、Fabric、Bugly等)来收集和分析异常信息,以便更好地定位问题...
Java为处理线程的非受检异常提供了一个机制,即通过实现`Thread.UncaughtExceptionHandler`接口。当线程因非受检异常终止时,会调用这个接口的`uncaughtException()`方法,从而允许开发者自定义异常处理逻辑,防止...
Java语言中,异常分为两种类型:检查异常(Checked Exceptions)和非检查异常(Unchecked Exceptions)。检查异常在编译时期就能被检测到,因此通常需要在方法签名中声明或通过try-catch进行捕获。而非检查异常,...
`try`块包含可能会抛出异常的代码,`catch`块用于捕获并处理异常,而`finally`块则确保无论是否发生异常,某些代码都会执行,通常用于资源清理。 Java还提供了`throws`关键字,允许在方法签名中声明一个方法可能抛...
在这个例子中,我们创建了一个新的`Thread.UncaughtExceptionHandler`,并在`uncaughtException()`方法中处理异常。`handleException()`方法可以包含任何你想要执行的异常处理逻辑,如记录日志、显示用户友好的错误...
在Java编程语言中,异常是程序运行时发生的错误,可以分为检查型异常(Checked Exception)和运行时异常(Unchecked Exception)。检查型异常是编译器强制要求捕获或者声明抛出的异常,如IOException;而运行时异常...
如果某个线程抛出未捕获异常且没有其他处理器处理,那么这个新的处理器就会介入。 通常的做法是在应用程序的基类`Application`中设置全局的未捕获异常处理器。我们可以通过创建一个自定义类来实现`...
`UncaughtExceptionHandler`是线程的默认未捕获异常处理器,当线程中抛出未被捕获的异常时,系统会调用这个处理器。以下是一个简单的`CrashHandler`实现: ```java public class CrashHandler implements Thread....