Java Thread线程内异常处理

本文章简单的记录一下异常相关的处理,已被后续遗忘后捡漏。

一、明确Java中的异常

 在明确处理之前,先大体说说Java里面的异常。

1.异常概念:

 Java中异常主要分为两大类:1).checked Exception(检查异常); 2).unchecked Exception(非检查异常)。对于unchecked exception也成RuntimeException.

 那么,问题来了,何为检查呢?
 简单的说,就是Java编译器是否要求你要捕获异常。对于unchecked exception,Java编译器不要求你一定要把它捕获或者一定要将抛出(throw),但对于checked exception,编译器会强制要求在method中捕获或者继续抛出的。

 下面是jdk 1.6中对uncheck exception的 声明:
    public class RuntimeException extends Exception
 RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。
  可能在执行方法期间抛出但未被捕获的 RuntimeException 的任何子类都无需在 throws 子句中进行声明。

 当然,对于check Exception, for instance: IOException :   
  public class IOException extends Exception

当发生某种 I/O 异常时,抛出此异常。此类是失败或中断的 I/O 操作生成的异常的通用类。

 如上,我们可以看到,check exception直接extends Exception,是需要在编译的时候就通过throws继续抛出或者通过try-catch进行捕获的。
 而uncheck exception(RuntimeException)是Exception的子类(如ArithmeticException extends RuntimeException),是不需要捕获或者继续抛出的。

 此外,Error也应该归类为unchecked Exception,因为我们无法预知他们产生的时间。起因一般不是应用程序自身的调用,而是VM自身的问题。Error类一般标识应用程序无法解决的严重问题,故将其视为非检测异常。

2.异常处理解决办法:

 1)对于unchecked Exception,我们一般有以下几种处理办法:1.捕获;2.继续抛出;3.不处理;
 2)对于checked Exception,我们有以下几种处理方式:1.继续抛出,一致可以抛给java VM处理;2.用try...catchj进行捕获;
 注意:对于检查异常必须处理或者捕获;

二、对于线程里非检测异常的处理

 异常处理是Java语言的重要特性之一,主要帮助我们明确一下几个问题:

 什么出错了?

 那里出错了?

 为什么出错?

 而在Thread 的run方法中,假设对uncheck Exception未做出明确处理,但在运行时出现RuntimeException,那么这个Thread就有可能因一个Exception而终止,导致这个线程的终结。
 而如果你想在没有做任何异常处理的情况下,对程序运行期间出现RuntimeException后做一定的资源释放或者后续工作处理,也就是说,在线程的run方法中出现一场后,要明确上面的三个问题。
 那么,首先,你得有一个捕获handle这个消息的地方;
 在jdk 5.0 之后,我们通过Thread的static方法 setUncaughtExceptionHandler() 静态方法设置未检查异常的异常处理器;

 下来看一下,这个方法的声明定义:
/**
     * <p>
     * Sets the uncaught exception handler. This handler is invoked in case this
     * Thread dies due to an unhandled exception.
     * </p>
     *
     * @param handler
     *            The handler to set or <code> null</code> .
     */
    public void setUncaughtExceptionHandler(UncaughtExceptionHandler handler) {
        uncaughtHandler = handler;
    }
接下来,就简单了,就是实现UncaughtExceptionHandler接口的事了。
/**
     * Implemented by objects that want to handle cases where a thread is being
     * terminated by an uncaught exception. Upon such termination, the handler
     * is notified of the terminating thread and causal exception. If there is
     * no explicit handler set then the thread's group is the default handler.
     */
    public static interface UncaughtExceptionHandler {
        /**
         * The thread is being terminated by an uncaught exception. Further
         * exceptions thrown in this method are prevent the remainder of the
         * method from executing, but are otherwise ignored.
         *
         * @param thread the thread that has an uncaught exception
         * @param ex the exception that was thrown
         */
        void uncaughtException(Thread thread, Throwable ex);
    }
其有一个监听器 uncaughtException,thread:标识那个线程出现unchecked Exception;ex:标识异常类型。

举例:
package com.thread;

public class ThreadUncatchTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Thread t = new Thread(new Runnable() {

            public void run() {
                int i = 2;
                int j = i / 0;//强制其抛出异常
                System.out.println(j);
                /*try {
                } catch (Exception e) {
                    System.out.println("--------------------");
                    e.printStackTrace();
                }*/
            }
        });
        t.setUncaughtExceptionHandler(new MyThreadCatchExceptionHander());
        t.start();
    }

}

class MyThreadCatchExceptionHander implements Thread.UncaughtExceptionHandler{

    public void uncaughtException(Thread thread, Throwable exception) {
        System.out.println("threadName:"+thread.getName()+";exception:"+exception.getMessage());
    }

}

上述例子演示了为某一特定的线程指定非检测异常的处理,也可以调用Thread.setDefaultUncaughtExcetpionHandler or Thread.setUncaughtExceptionHandler来全局设置线程的unchecked Exception捕获监听。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值