Java Thread 如何处理未捕获的异常?
Java Thread是不允许异常抛出到本线程之外的,Runnable接口的public abstract void run()是不允许throws Exception的,这在编译时就通不过。
线程异常处理方式两种:
- try/catch
这种方式很简单很暴力,但是代码不太优雅。一般我们只捕获编译时异常。更优雅的做法就是第二种通过UncaughtExceptionHandler接口实现。 Thread.UncaughtExceptionHanlder
- 在创建线程的时候进行设置
public class ThreadExceptionCatch {
public static void main(String[] args) {
Thread t = new Thread() {
@Override
public void run() {
//todo something....
throw new RuntimeException("异常了");
}
};
t.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println(t.getName()+"发生异常:"+e);
}
}); t.start();
} }
- 使用Executors创建线程时,还可以在ThreadFactory中设置
public class ThreadExceptionCatch {
public static void main(String[] args) {
ExecutorService executorService= Executors.newFixedThreadPool(10, new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread thread=new Thread(r);
//设置异常处理器
thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println(e);
}
});
return thread;
}
});
//执行
executorService.execute(new Runnable() {
@Override
public void run() {
throw new RuntimeException("异常了");
}
});
} }
- 设置Thread全局默认UnCaughtExceptionHandler
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println(e);
}
});
defaultUncaughtExceptionHandler是Thread的静态变量:
private static volatile UncaughtExceptionHandler defaultUncaughtExceptionHandler;
Java Thread 如何处理未捕获的异常?的更多相关文章
- Android中使用UncaughtExceptionHandler来处理未捕获的异常
原文在sparkyuan.me上.转载注明出处:http://sparkyuan.github.io/2016/03/28/使用UncaughtExceptionHandler来处理未捕获的异常/ 全 ...
- 编写高质量代码改善C#程序的157个建议——建议65:总是处理未捕获的异常
建议65:总是处理未捕获的异常 处理为捕获的异常是每个应用程序具备的基本功能,C#在APPDomain提供了UnhandledException事件来接收未捕获到的异常的通知.常见的应用如下: sta ...
- c#处理未捕获的异常(UnhandledException)
处理未捕获的异常,放在program类的Main函数下 1.UnhandledException 作用:接收未捕获到的异常 例: static void Main(string[] args) { A ...
- Java处理Exception无法捕获的异常
场景: 使用try...catch(Exception e){}来捕获异常,执行过程中线程中断或阻塞了,但是catch块中却并没有捕获到异常信息. try{ // 此处可能是调用一个远程的接口,或是调 ...
- C# 截获某个域中未捕获的异常 CLR20R3 程序终止的几种解决方案
AppDomain.UnhandledException可以获的异常,却截不下来,求解 AppDomain.CurrentDomain.UnhandledException += CurrentDom ...
- android 捕获所有异常 未捕获的异常
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 定义一个类 继承 应用, 实现 未捕获异常处理器 uncaughtExceptionHa ...
- Android处理未捕获的异常(应用全局异常)
public class CrashHandler implements UncaughtExceptionHandler { private static CrashHandler instance ...
- Java & Android未捕获异常处理机制
一.背景 无论是Java还是Android项目,往往都会用到多线程.不管是主线程还是子线程,在运行过程中,都有可能出现未捕获异常.未捕获异常中含有详细的异常信息堆栈,可以很方便的去帮助我们排查问题. ...
- JAVA Thread线程异常监控
一.场景描述:单线程程序可以用try...catch捕获程序的异常,而在多线程程序的时候是无法使用try...catch捕获. 示例1:多线程发生异常,无法使用try...catch捕获问题 publ ...
随机推荐
- 换个思路理解Javascript中的this
https://segmentfault.com/a/1190000010328752
- HTTP 错误 404.3 解决
问题 由于扩展配置问题而无法提供您请求的页面.如果该页面是脚本,请添加处理程序.如果应下载文件,请添加 MIME 映射. 解决 在开始菜单中找到 Visual Studio 命令提示工具.然后用管理员 ...
- HLS图像处理系列——肤色检測
本博文採用Xilinx HLS 2014.4工具.实现一个肤色检測的模块.当中,本文重点是构建HLS图像处理函数. 新建HLSproject的步骤,本博文不再详述. 本project新建之后,仅仅加入 ...
- IM软件业务知识—导航
----------------------------------------------------欢迎查看IM软件业务知识<专栏>-------------------------- ...
- HBase表的架构原理
HBase总体架构图 Hbase Table的基本单位是Region,一个Table相应多个Region.Table层级关系例如以下: Table (HBase table) Re ...
- 使用mt_rand代替rand
mt_rand比rand生成的随机数“更随机”,重复值较少 下面是测试: <?php function t1($num=10000){ $arr = array(); for ($i=0; $i ...
- php 实现 java com.sun.org.apache.xml.internal.security.utils.Base64 Byte数组加密
<?php function java_base64_encode($arr){ $str = ''; foreach ($arr as $key => $value) { $str .= ...
- Python SQLAlchemy 模块
SQLAlchemy 简介: SQLAlchemy 是用于实现 ORM(Object Relational Mapping,对象关系映射)的一个模块,即把数据库的表结构映射到对象上在 Python 中 ...
- UE4 Run On Server与Run on owning client
- Win8/8.1下驱动安装“数据无效”错误的有效解决方法
Windows8.1 安装完vmware 后并没有安装 vmnet1,vmnet8 这两个虚拟网卡,纠结了半天,原来是两个服务没打开. 如果你使用的是Windows8或者8.1,并且精简过系统,那么在 ...