文档章节

并发编程实战 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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

阿里云API网关使用教程

API 网关(API Gateway)提供高性能、高可用的 API 托管服务,帮助用户对外开放其部署在 ECS、容器服务等阿里云产品上的应用,提供完整的 API 发布、管理、维护生命周期管理。用户只需进行简...

mcy0425
34分钟前
4
0
解决远程登陆误按ctrl+s锁屏假死恢复

使用putty时,偶尔发生屏幕假死,不能输入等情况。 后来发现,只要数据ctrl+s,就会假死;输入ctrl+q就可以恢复过来。 很多刚从windows转移到linux上来工作的朋友,在用vi/vim编辑文件时,常常...

HJCui
37分钟前
0
0
@Transactional

事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编程式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于...

asdf08442a
42分钟前
2
0
widows下强制解除8080端口占用问题

使用win+R打开命令窗口 输入以下命令查看哪个任务占用了8080端口 netstat -ano |findstr "8080" 然后通过任务id强制关闭占用该端口的进程 tskill 10044 // 自己的试情况而定,这个ID是LISTE...

_Artisan
51分钟前
2
0
productFlavors简单实用

最近项目中,不同环境需要配置的参数越来越多,为了减少修改代码次数。研究了一下productFlavors的使用方式,总结如下 1. as3.0以上版本使用productFlavors时需要指定一个flavorDimensions,...

火云
53分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部