文档章节

并发编程实战 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
海淀
程序员
私信 提问
那些年,关于 Java 的那些事儿

版权声明:Follow your heart and intuition. https://blog.csdn.net/qq_35246620/article/details/78695893 温馨提示:本系列博文(含示例代码)已经同步到 GitHub,地址为「java-skills」,...

维C果糖
2017/12/02
0
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
919
2
浅谈Java的内存分配和垃圾回收

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

waffle930
2016/10/02
29
0
熟练的掌握Scala语言系列课程

课程名字:熟练的掌握Scala语言系列课程 课程网盘下载: http://pan.baidu.com/s/1pJuRAsV 密码: ahr3 课程内容: 共10章,58课时,总时长944分钟 想要深入研究spark,掌握好scala至关重要,目...

混坛魔王
2015/01/09
822
4
C#-JudgeSystem判题系统-开放实验总结

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

tmj
2015/08/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

聊聊flink的FsStateBackend

序 本文主要研究一下flink的FsStateBackend StateBackend flink-runtime_2.11-1.7.0-sources.jar!/org/apache/flink/runtime/state/StateBackend.java @PublicEvolvingpublic interface Sta......

go4it
32分钟前
1
0
webpack配置proxyTable时pathRewrite无效的解决方法

webpack配置接口地址代理 在项目开发中,接口联调的时候一般都是同域名下,且不存在跨域的情况下进行接口联调,但是当我们在本地启动服务器后,比如本地开发服务下是 http://localhost:8080 ...

前端小攻略
32分钟前
1
0
安装jenkins

1.下载 wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/war/2.155/jenkins.war 2.后续操作和 dubbo 安装类似: (1)复制一份空白的tomcat,重命名为:jenkins-tomcat (2)war包放入t...

狼王黄师傅
40分钟前
2
0
zookeeper配置与使用

一.登录官网下载 不要带后缀的,那是公侧版本,下稳定版,比如3.4.9 二.安装与使用 解压后bin里是启动程序 配置文件:在conf下 复制zoo_sample.cfg改名为为zoo.cfg,打开zoo修改文件 临时数据保存...

小兵胖胖
今天
3
0
spring源码阅读笔记(一)

ClassPathXmlApplicationContext 与 FileSystemXmlApplicationContext 用了这么久的框架,是时候搞一下源码了,一般最初接触spring 从以下步骤开始 创建一个bean类 并创建 ooxx.xml之类的spr...

NotFound403
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部