文档章节

并发编程实战 1.7. 处理运行时异常 - setUncaughtExceptionHand()

火犀牛
 火犀牛
发布于 2016/05/11 14:52
字数 674
阅读 5
收藏 0

在java中有两种异常:

1. Checked Exception(非运行时异常):这种异常必须在方法的throws语句中指定,或者在方法体内使用try/catch块捕获,例如: IOException和 ClassNotFoundException。

2. UncheckedException(运行时异常):这种异常由于出现的场景非常多,所以即不需要方法指定,也不需要捕获,例如:NumberFormatException。

run()方法不支持throws语句

run()方法不支持throws语句,所以当运行时异常从run()方法中抛出时,默认行为是在控制台输出堆栈记录并且退出程序。但是,使用 setUncaughtExceptionHand()方法可以捕获及处理运行时异常。

范例:1. 创建一个进程进行计算后,出现运行时异常;2. 在异常处理类中处理捕获到的运行时异常;

package com.rr.concurrent.chapter1.recipe8.test;

/**
 * Created by isaac_gu on 2016/5/11.
 * 1. 创建一个进程进行计算后,出现运行时异常;
 */
public class Task implements Runnable {

    @Override
    public void run() {
        int a = 10;
        int b = 0;
        int c = a / b;
        System.out.println("c : " + c);
    }
}

异常处理:

package com.rr.concurrent.chapter1.recipe8.test;

/**
 * Created by isaac_gu on 2016/5/11.
 * 2. 在异常处理类中处理捕获到的运行时异常;
 */
public class MyExceptionHandler implements Thread.UncaughtExceptionHandler {
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.out.printf("1. %s 线程出现了异常!\n", t.getName());
        System.out.printf("2. Exception: %s: %s\n", e.getClass().getName(), e.getMessage());
        System.out.printf("3. Stack Trace: \n");
        e.printStackTrace(System.out);
        System.out.printf("4. Thread status: %s\n", t.getState());
    }
}

测试类:

package com.rr.concurrent.chapter1.recipe8.test;

import java.util.concurrent.TimeUnit;

/**
 * Created by isaac_gu on 2016/5/11.
 * 范例:1. 创建一个进程进行计算后,出现运行时异常;2. 在异常处理类中处理捕获到的运行时异常;
 */
public class Test {
    public static void main(String[] args) {
        Thread thread = new Thread(new Task());
        //设置异常处理类
        thread.setUncaughtExceptionHandler(new MyExceptionHandler());
        thread.start();

        //两秒后主线程结束
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("主线程结束!");

    }
}

运行结果:

1. Thread-0 线程出现了异常!
2. Exception: java.lang.ArithmeticException: / by zero
3. Stack Trace: 
java.lang.ArithmeticException: / by zero
	at com.rr.concurrent.chapter1.recipe8.test.Task.run(Task.java:13)
	at java.lang.Thread.run(Thread.java:745)
4. Thread status: RUNNABLE
主线程结束!

Thread 类还有一个处理未捕获到的异常,静态方法 setDefaultUncaughtExcptionHandler();

当线程抛出一个异常的时候:

首先,它查找线程设置的异常处理器(UncaughtExcptionHandler );

如果没有,查找线程组(ThreadGroup)的异常处理器;

如果还找不到,将查找默认的异常处理器( DefaultUncaughtExcptionHandler );

如果没有一个处理器存在,jvm打印异常到控制台,并退出程序。

© 著作权归作者所有

共有 人打赏支持
火犀牛
粉丝 0
博文 27
码字总数 12180
作品 0
海淀
程序员
JRuby 1.7 首个预览版发布,修复259处bug

JRuby是Ruby编程语言的纯Java实现,它结合了Ruby简洁的语法以及Java丰富的类库。通过JRuby,你可以在JVM上直接运行Ruby程序,调用Java的类库。 JRuby 1.7的主要改进包括: Ruby 1.9.3现在是默...

oschina
2012/05/22
903
2
浅谈Java的内存分配和垃圾回收

此文为本人阅读了《深入理解Java虚拟机》的内存管理部分知识所整理的较简要的读书笔记。 自动内存管理机制部分: ①运行时数据区分为:程序计数器、虚拟机栈、本地方法栈、方法区、堆。其中程...

waffle930
2016/10/02
29
0
C#-JudgeSystem判题系统-开放实验总结

花了一周的时间去做这个实验中间断断续续完成不同的部分,按照实验过程来一步一步完成感觉实验流程还是相当合理的 上图就是最后的成品,其中包括 JudgeCilent客户端 完成部分: 1、可以提供五...

tmj
2015/08/19
0
0
Scala实战:并发-Future和Promise

并发编程是很困难的,特别是在你没有很好的设计与抽像你的功能层次时。传统的并发解决方案是采用多线程和共享变量,这使得随着代码的增加你很难找到错误根源。 Scala中采用了更好的方案,它不...

羊八井
2015/12/02
1K
0
java开发面试准备提纲

第一部分:java基础 JVM和GC:java虚拟机内存分配,类加载机制(双亲委派模型,Bootstrap Classloader, Extension ClassLoader, Application ClassLoader),Eden space,from space,to sp...

isam
2016/03/30
84
0

没有更多内容

加载失败,请刷新页面

加载更多

kubeadm部署kubernetes集群

一、环境要求 这里使用RHEL7.5 master、etcd:192.168.10.101,主机名:master node1:192.168.10.103,主机名:node1 node2:192.168.10.104,主机名:node2 所有机子能基于主机名通信,编辑...

人在艹木中
今天
6
0
Shell特殊符号总结以及cut,sort,wc,uniq,tee,tr,split命令

特殊符号总结一 * 任意个任意字符 ? 任意一个字符 # 注释字符 \ 脱义字符 | 管道符 # #号后的备注被忽略[root@centos01 ~]# ls a.txt # 备注 a.txt[root@centos01 ~]# a=1[root@centos01...

野雪球
今天
2
0
OSChina 周二乱弹 —— 程序员圣衣

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文:分享Skeeter Davis的单曲《The End of the World》 《The End of the World》- Skeeter Davis 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
今天
14
0
[ python import module ] 导入模块

import moudle_name ----> import module_name.py ---> import module_name.py文件路径 -----> sys.path (这里进行查找文件) # from app.web import Personimport app.web.Person as Pe......

_______-
昨天
5
0
Redis性能问题排查解决手册

一、性能相关的数据指标 通过Redis-cli命令行界面访问到Redis服务器,然后使用info命令获取所有与Redis服务相关的信息。通过这些信息来分析文章后面提到的一些性能指标。 nfo命令输出的数据可...

IT--小哥
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部