有没有发生过这样的情况,你写的工作线程莫名其妙的挂了,如果不是被你刚好看到,拿只能抓瞎了,不知道啥原因了,因为异常的时候只会把stack trace打在控制台上,不会记在你想记得错误日志里,头皮都抓破了也没能找到确切的地方,最后只能在能加try catch 的地方都给加上。

  Java的异常可以分为这两类,Checked Exceptions和Unchecked Exceptions。

checked exception例子FileNotFoundException,IOException,...

unchecked exception例子NumberFormatException...

  我感觉第一类异常就是我们在调用java的方法时,api中指明了是有可能抛出异常,且该类异常是必须捕获的(或向上抛出),否则代码编译不通过,如下:

try {
FileOutputStream fos = new FileOutputStream(new File(""));
} catch (FileNotFoundException e) {//如果此处不进行catch则会编译不通过 }

  而第二类异常,调用某些方法时,api也提示了可能会抛出某些异常,但该类异常不是一定要捕获的(不捕获编译也能通过),如下

int i = Integer.parseInt("ff");//该方法的完整声明public static int parseInt(String s) throws NumberFormatException

  不进行try catch也一样能运行,但运行时如果出错,只会在控制台打印下,后面再发现程序有问题很难查找。

  其实Java已经提供了对上述第二类异常问题的处理方法,那就是为Thread设置UncaughtExceptionHandler,即对未知异常的处理,这时你就可以进行相关日志操作了,具体如何做如下:

  先创建一个实现了UncaughtExceptionHandler接口的类

class MyExceptionHandler implements UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread t, Throwable e) {//在这你可以记录相关错误日志到文件中
System.out.printf("An exception has been captured\n");
  System.out.printf("Thread:%s\n", t.getName());
  System.out.printf("Exception: %s: %s:\n", e.getClass().getName(), e.getMessage());
  System.out.printf("Stack Trace:\n");
  e.printStackTrace();
  System.out.printf("Thread status:%s\n", t.getState());
}
}

  将上述Handler的实例赋予你所建的线程

        Thread thread = new Thread(new ThreadTest1());
thread.setUncaughtExceptionHandler(new MyExceptionHandler());
thread.start();

  如果ThreadTest1中出现了未被捕获的异常,则会执行MyExceptionHandler中的uncaughtException方法,这样就不用死的不明不白了

Java Thread UncaughtExceptionHandler的更多相关文章

  1. JAVA Thread线程异常监控

    一.场景描述:单线程程序可以用try...catch捕获程序的异常,而在多线程程序的时候是无法使用try...catch捕获. 示例1:多线程发生异常,无法使用try...catch捕获问题 publ ...

  2. Android Thread.UncaughtExceptionHandler捕获

    在Java 的异常处理机制中:如果抛出的是Exception异常的话,必须有try..catch..进行处理,属于checked exception.如果抛出的是RuntimeException异常的 ...

  3. Java thread中对异常的处理策略

    转载:http://shmilyaw-hotmail-com.iteye.com/blog/1881302 前言 想讨论这个话题有一段时间了.记得几年前的时候去面试,有人就问过我一个类似的问题.就是j ...

  4. java thread 线程锁同步,锁,通信

    12.线程同步 当多个线程访问同一个数据时,非常容易出现线程安全问题.这时候就需要用线程同步 Case:银行取钱问题,有以下步骤: A.用户输入账户.密码,系统判断是否登录成功 B.用户输入取款金额 ...

  5. Java并发-UncaughtExceptionHandler捕获线程异常信息并重新启动线程

    Java并发-UncaughtExceptionHandler捕获线程异常信息并重新启动线程 一.捕获异常并重新启用线程 public class Testun { public static voi ...

  6. Java Thread 如何处理未捕获的异常?

    Java Thread是不允许异常抛出到本线程之外的,Runnable接口的public abstract void run()是不允许throws Exception的,这在编译时就通不过. 线程异 ...

  7. Java Thread 的 sleep() 和 wait() 的区别

    Java Thread 的使用 Java Thread 的 run() 与 start() 的区别 Java Thread 的 sleep() 和 wait() 的区别       1. sleep ...

  8. Java Thread 的 run() 与 start() 的区别

    Java Thread 的使用 Java Thread 的 run() 与 start() 的区别 Java Thread 的 sleep() 和 wait() 的区别             1. ...

  9. Java Thread wait, notify and notifyAll Example

    Java Thread wait, notify and notifyAll Example Java线程中的使用的wait,notify和nitifyAll方法示例. The Object clas ...

随机推荐

  1. 关于 JavaScript 中一个小细节问题 (在控制台中直接 {Name:'王尼玛',Age:20} 对象报错问题)

    在 Chrome 浏览器,大家可能遇到这样一个小问题. 随便输入一个 Object 对象  ,比如 {Name:'王尼玛',Age:20} ,将会报错.之前,也从来没去考虑过到底是为啥原因. 今天,刚 ...

  2. flex-mp3

    Mp3Player.as package ddw.adobe { import flash.events.Event; import flash.events.IOErrorEvent; import ...

  3. NAT的全然分析及其UDP穿透的全然解决方式

    NAT的全然分析及其UDP穿透的全然解决方式   一:基本术语 防火墙 防火墙限制了私网与公网的通信,它主要是将(防火墙)觉得未经授权的的包丢弃,防火墙仅仅是检验包的数据,并不改动数据包中的IP地址和 ...

  4. Codeforces Round #276 (Div. 1) B. Maximum Value 筛倍数

    B. Maximum Value Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/484/prob ...

  5. C#中判断空字符串的3种方法性能分析

    3种方法分别是:string a="";1.if(a=="")2.if(a==String.Empty)3.if(a.Length==0) 3种方法都是等效的, ...

  6. UVa 1252 - Twenty Questions(记忆化搜索,状态压缩dp)

    本文出自   http://blog.csdn.net/shuangde800 题目链接:点击打开链接 题目大意 有n个长度为m的二进制串,每个都是不同的. 为了把所有字符串区分开,你可以询问,每次可 ...

  7. STL中heap算法(堆算法)

     ①push_heap算法 以下是push_heap算法的实现细节.该函数接收两个迭代器,用来表现一个heap底部容器(vector)的头尾,而且新元素已经插入究竟部的最尾端. template ...

  8. Swift3.0语法变化

    写在前面 首先和大家分享一下学习新语法的技巧:用Xcode8打开自己的Swift2.3的项目,选择Edit->Convert->To Current Swift Syntax- 让Xcod ...

  9. MySQL:ONDUPLICATEKEYUPDATE用法

    如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行UPDATE:如果不会导致唯一值 ...

  10. VBoxGuestAdditions下载地址

    http://dlc.sun.com.edgesuite.net/virtualbox/