刚刚看到ResourceManager源码第一行,就遇到了比较陌生的用法,特意研究一下,如何使用?
看源码的目标不就是学习,更好的来完善自己的代码,而不是面试时候的谈资。
下面是一个自己写的demo,setDefaultUncaughtExceptionHandler作用相当于一个全局的catch。一般情况下用于记录当程序发生你未捕获的异常的时候,调用一个你默认的handler来进行某些操作,比如记录客户端版本,异常信息,等客户信息,方便收集异常原因。
通常来讲,会针对,某段代码做try … catch 没有catch到的代码,发生异常的时候,就会由setDefaultUncaughtExceptionHandler来处理。
package com.yanbit.source.study; import java.lang.Thread.UncaughtExceptionHandler; /** * @author yanbit * */ public class GlobExceptionHandler { public static void main(String[] args) { Thread t = new Thread(new AdminThread()); t.setDefaultUncaughtExceptionHandler(new ExceptionHandler()); //对当前线程设置默认catch t.start(); } } class AdminThread implements Runnable { @Override public void run() { try { Thread.sleep(2000); System.out.println("start ... Exception"); Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } throw new NullPointerException(); //直接exception } } class ExceptionHandler implements UncaughtExceptionHandler { @Override public void uncaughtException(Thread t, Throwable e) { //调用此方法来进行,对异常处理,需要实现UncaughtExceptionHandler 接口 System.out.println("Thread:" + t + " Exception message:" + e); } }
太赞了,又从开源项目学到一些东西。over
抄到此为止,附上自己的demo:
自定义未捕获异常处理:
package test; import java.lang.Thread.UncaughtExceptionHandler; public class MyExceptionHandler implements UncaughtExceptionHandler{ public void uncaughtException(Thread t, Throwable e) { System.out.println(t);//打印当前线程信息 System.out.println("谁说 "+e.getMessage());//打印自定义异常信息 } }
测试:
package test; public class Test5 { private static Thread t = new Thread(new Runnable() { public void run() { System.out.println("start ... Exception"); throw new NullPointerException("处理不了我"); //模拟抛出未首检异常, 假设这是首检异常, 没有catch到 } }); public static void main(String[] args) { Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler());//全局, 设置未捕获异常处理 //t.setUncaughtExceptionHandler(new MyExceptionHandler());//此线程, 设置未捕获异常处理 t.start(); } }
打印结果:
start ... Exception Thread[Thread-0,5,main] 谁说 处理不了我
很明显,对异常进行处理了,害不害怕!