`
coach
  • 浏览: 386778 次
  • 性别: Icon_minigender_2
  • 来自: 印度
社区版块
存档分类
最新评论

java线程unchecked 异常的处理UncaughtExceptionHandler

阅读更多
    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;
        }
    }
}
分享到:
评论
2 楼 mojunbin 2012-04-22  
嗯嗯,uncaughtException这个类可以帮我们回收一些资源.
1 楼 aspnetdb 2011-03-18  
写的还挺清晰

相关推荐

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

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

    基于Java子线程中的异常处理方法(通用)

    在Java子线程中处理异常是一个非常重要的主题,因为在并发情况下,捕获和处理异常变得更加复杂。本文将探讨如何在父线程中捕获来自子线程的异常,并提供三种常用方法来解决这个问题。 问题分析 在普通的单线程程序...

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

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

    android全局异常处理

    对于AsyncTask、Handler、Runnable等异步任务,需要在代码中显式捕获并处理异常。 在实际项目中,我们通常会结合使用CrashReport工具(如Crashlytics、Fabric、Bugly等)来收集和分析异常信息,以便更好地定位问题...

    Java并发编程示例(八):处理线程的非受检异常

    Java为处理线程的非受检异常提供了一个机制,即通过实现`Thread.UncaughtExceptionHandler`接口。当线程因非受检异常终止时,会调用这个接口的`uncaughtException()`方法,从而允许开发者自定义异常处理逻辑,防止...

    android非捕获异常处理

    Java语言中,异常分为两种类型:检查异常(Checked Exceptions)和非检查异常(Unchecked Exceptions)。检查异常在编译时期就能被检测到,因此通常需要在方法签名中声明或通过try-catch进行捕获。而非检查异常,...

    java中Exception的细节

    `try`块包含可能会抛出异常的代码,`catch`块用于捕获并处理异常,而`finally`块则确保无论是否发生异常,某些代码都会执行,通常用于资源清理。 Java还提供了`throws`关键字,允许在方法签名中声明一个方法可能抛...

    Android异常

    在这个例子中,我们创建了一个新的`Thread.UncaughtExceptionHandler`,并在`uncaughtException()`方法中处理异常。`handleException()`方法可以包含任何你想要执行的异常处理逻辑,如记录日志、显示用户友好的错误...

    捕获异常自动重启

    在Java编程语言中,异常是程序运行时发生的错误,可以分为检查型异常(Checked Exception)和运行时异常(Unchecked Exception)。检查型异常是编译器强制要求捕获或者声明抛出的异常,如IOException;而运行时异常...

    Android 捕获运行时异常详解

    如果某个线程抛出未捕获异常且没有其他处理器处理,那么这个新的处理器就会介入。 通常的做法是在应用程序的基类`Application`中设置全局的未捕获异常处理器。我们可以通过创建一个自定义类来实现`...

    Android崩溃异常捕获方法

    `UncaughtExceptionHandler`是线程的默认未捕获异常处理器,当线程中抛出未被捕获的异常时,系统会调用这个处理器。以下是一个简单的`CrashHandler`实现: ```java public class CrashHandler implements Thread....

Global site tag (gtag.js) - Google Analytics