Java Thread UncaughtExceptionHandler
有没有发生过这样的情况,你写的工作线程莫名其妙的挂了,如果不是被你刚好看到,拿只能抓瞎了,不知道啥原因了,因为异常的时候只会把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的更多相关文章
- JAVA Thread线程异常监控
一.场景描述:单线程程序可以用try...catch捕获程序的异常,而在多线程程序的时候是无法使用try...catch捕获. 示例1:多线程发生异常,无法使用try...catch捕获问题 publ ...
- Android Thread.UncaughtExceptionHandler捕获
在Java 的异常处理机制中:如果抛出的是Exception异常的话,必须有try..catch..进行处理,属于checked exception.如果抛出的是RuntimeException异常的 ...
- Java thread中对异常的处理策略
转载:http://shmilyaw-hotmail-com.iteye.com/blog/1881302 前言 想讨论这个话题有一段时间了.记得几年前的时候去面试,有人就问过我一个类似的问题.就是j ...
- java thread 线程锁同步,锁,通信
12.线程同步 当多个线程访问同一个数据时,非常容易出现线程安全问题.这时候就需要用线程同步 Case:银行取钱问题,有以下步骤: A.用户输入账户.密码,系统判断是否登录成功 B.用户输入取款金额 ...
- Java并发-UncaughtExceptionHandler捕获线程异常信息并重新启动线程
Java并发-UncaughtExceptionHandler捕获线程异常信息并重新启动线程 一.捕获异常并重新启用线程 public class Testun { public static voi ...
- Java Thread 如何处理未捕获的异常?
Java Thread是不允许异常抛出到本线程之外的,Runnable接口的public abstract void run()是不允许throws Exception的,这在编译时就通不过. 线程异 ...
- Java Thread 的 sleep() 和 wait() 的区别
Java Thread 的使用 Java Thread 的 run() 与 start() 的区别 Java Thread 的 sleep() 和 wait() 的区别 1. sleep ...
- Java Thread 的 run() 与 start() 的区别
Java Thread 的使用 Java Thread 的 run() 与 start() 的区别 Java Thread 的 sleep() 和 wait() 的区别 1. ...
- Java Thread wait, notify and notifyAll Example
Java Thread wait, notify and notifyAll Example Java线程中的使用的wait,notify和nitifyAll方法示例. The Object clas ...
随机推荐
- 谈谈 JavaScript 中的 this 指向问题
JavaScript 中的 this 为一个重难点,它不像静态语言 C#.Java 一样,就表示当前对象.而在 JS 中, this 是运行时确定,而并非定义时就已确定其值. 谈起 this ,必须少 ...
- SQL创建linkserver
建立链接服务器并创建同义词,有一个最大的好处,就是可以跨数据库实例进行操作数据库,可以在一个数据库连接内完成数据操作,方便做事务查询. 在SQL SERVER 2008里,可以按以下的方式建立 ...
- 目录启动CXF启动报告LinkageError异常以及Java的endorsed机制
本文纯属个人见解,是对前面学习的总结,如有描述不正确的地方还请高手指正~ Exception in thread "main" java.lang.LinkageError: JA ...
- hive-0.10.0-cdh4.3.0安装
1.我使用的Hadoop2.0-cdh4.3.0,相应hive配套版本号hive-0.10.0-cdh4.3.0. 2.改动hive/conf下hive-site.xml文件,无则创建hive- ...
- Quart 2D 绘制图形简单总结
0 CGContextRef context = UIGraphicsGetCurrentContext(); 设置上下文 1 CGContextMoveToPoint 开始画线 2 CGConte ...
- Seconds_Behind_Master
http://blog.chinaunix.net/uid-28212952-id-3494560.html 今天同事遇到一个故障,xtrabackup备份中flush tables with rea ...
- 最简单的Java调用C/C++代码的步骤
1)首先在Java类中声明一个native的方法 (2)使用javah命令生成包含native方法声明的C/C++头文件 (3)按照生成的C/C++头文件来写C/C++源文件 (4)将C/C++源文件 ...
- TortoiseGit安装教程
TortoiseGit 是Windows下的可视化Git界面. 下载Git 网站地址: http://code.google.com/p/tortoisegit/ 安装前必须装上msysgit才能在W ...
- Scala Java Error: value filter is not a member of *
有时在Scala中调用Java的库,Java库会返回某些Java的集合或类型,必须经过一些转换才能正常使用. 否则有可能在编译的过程遇到这个错误. 错误字符串 下面是错误的主要信息. Scala Ja ...
- Eclipse常用快捷键集合
一.通用快捷键 [ALT+/] 此快捷键为用户编辑的神级好帮手,能为用户提供内容的辅助,不要为记不全方法和属性名称犯愁下 [Ctrl+T] 搜索当前接口的实现类 [Ctrl+O] 显示类中方法和 ...