2011年2月26日星期六

java线程unchecked 异常的处理UncaughtExceptionHandler(转)

 Thread的run方法是不抛出任何检查型异常(checked exception)的,但是它自身却可能因为一个异常而被终止,导致这个线程的终结。最麻烦的是,在线程中抛出的异常即使在主线程中使用try...catch也无法截获,因此可能导致一些问题出现,比如异常的时候无法回收一些系统资源,或者没有关闭当前的连接等等。 

    主线程之所以不处理子线程抛出的RuntimeException,是因为线程是异步的,子线程没结束,主线程可能已经结束了。 

    UncaughtExceptionHandler名字意味着处理未捕获的异常。更明确的说,它处理未捕获的运行时异常。Java编译器要求处理所有非运行时异常,否则程序不能编译通过。这里“处理”的是方法里throws子句声明的异常或在try-catch块里的catch子句的异常。 

Java代码 
  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. }  

没有评论:

发表评论