文档章节

Java并发编程初级篇(七):捕获线程中的运行时异常

阿拉德大陆的魔法师
 阿拉德大陆的魔法师
发布于 2016/11/23 15:16
字数 423
阅读 32
收藏 2

Java API中为我们提供了一个用于捕获线程内部运行时异常的接口。实现这个接口并给线程指定异常捕获器就可以达到目的。

public interface UncaughtExceptionHandler {
    /**
     * Method invoked when the given thread terminates due to the
     * given uncaught exception.
     * <p>Any exception thrown by this method will be ignored by the
     * Java Virtual Machine.
     * @param t the thread
     * @param e the exception
     */
    void uncaughtException(Thread t, Throwable e);
}

因为线程类的run()方法并不能抛出异常,所以如果不为线程指定UncaughtExceptionHandler,那么当遇到运行时异常的时候就会在控制台打印异常堆栈信息,并终止线程。

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        Integer.parseInt("ABC");
    }

    public static void main(String[] args) {
        Thread thread = new Thread(new MyRunnable(), "MyThread-1");
        //thread.setUncaughtExceptionHandler(new ExceptionHandler());
        thread.start();
    }
}

Exception in thread "MyThread-1" java.lang.NumberFormatException: For input string: "ABC"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:492)
	at java.lang.Integer.parseInt(Integer.java:527)
	at oschian.concurrency.section_07.MyRunnable.run(MyRunnable.java:9)
	at java.lang.Thread.run(Thread.java:745)

首先我们实现一个线程异常处理器,需要重写uncaughtException方法。

public class ExceptionHandler implements Thread.UncaughtExceptionHandler {
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.out.printf("ExceptionHandler: An exception has been captured.\n");
        System.out.printf("Thread: %s %s %s\n", t.getName(), e.getClass(), e.getMessage());
    }
}

接下来我们定义一个线程,在线程内部模拟一个运行时异常。使用setUncaughtExceptionHandler方法给这个线程指定异常处理器并启动线程。

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        Integer.parseInt("ABC");
    }

    public static void main(String[] args) {
        Thread thread = new Thread(new MyRunnable(), "MyThread-1");
        thread.setUncaughtExceptionHandler(new ExceptionHandler());
        thread.start();
    }
}

查看控制台你会发现异常处理器捕获了运行时异常并处理。

ExceptionHandler: An exception has been captured.
Thread: MyThread-1 class java.lang.NumberFormatException For input string: "ABC"

 

© 著作权归作者所有

共有 人打赏支持
阿拉德大陆的魔法师
粉丝 24
博文 91
码字总数 83019
作品 0
西城
程序员
Java 复习 —— 异常处理

前言 异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...else...来控制异常了,也许是自发的,然而这种控制异常痛苦,同一个异常或者错误...

learn_more
2015/08/21
0
0
Java学习系列文章:说说Java中的异常

在正常的程序设计中,程序异常处理是非常关键和重要的一部分。试想一个项目中没有一个好的异常处理,这个项目会怎么样? 什么是异常 异常其实是程序上的错误,包括程序逻辑错误和系统错误。比...

java高级架构牛人
06/29
0
0
读书笔记之《Java并发编程的艺术》-线程池和Executor的子孙们

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
0
1
用 JNI 进行 Java 编程(4)

高级主题 概述 从 Java 程序内调用本机代码破坏了 Java 程序的可移植性和安全性。尽管已编译的 Java 字节码保持了很好的可移植性,但必须为您打算用来运行该应用程序的每个平台重新编译本机代...

Jerikc
2012/10/08
0
0
【转】Java线程面试题Top50

目录(?)[-] 50道Java线程面试题 1 什么是线程 2 线程和进程有什么区别 3 如何在Java中实现线程 4 用Runnable还是Thread 6 Thread 类中的start 和 run 方法有什么区别 7 Java中Runnable和Cal...

gehui
2015/08/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

WinDbg

参考来自:http://www.cnit.net.cn/?id=225 SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols ctrl + d to open dump_file Microsoft (R) Windows Debugger Version 6.12.0002.633......

xueyuse0012
31分钟前
2
0
OSChina 周五乱弹 —— 想不想把92年的萝莉退货

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @罗马的王:分享松澤由美的单曲《地球ぎ》 很久没看圣斗士星矢了 《地球ぎ》- 松澤由美 手机党少年们想听歌,请使劲儿戳(这里) @开源中国首...

小小编辑
58分钟前
10
1
springBoot条件配置

本篇介绍下,如何通过springboot的条件配置,控制Bean的创建 介绍下开发环境 JDK版本1.8 springboot版本是1.5.2 开发工具为 intellij idea(2018.2) 开发环境为 15款MacBook Pro 前言 很多时候,...

贺小五
今天
1
0
javascript source map 的使用

之前发现VS.NET会为压缩的js文添加一个与文件名同名的.map文件,一直没有搞懂他是用来做什么的,直接删除掉运行时浏览器又会报错,后来google了一直才真正搞懂了这个小小的map文件背后的巨大...

粒子数反转
昨天
1
0
谈谈如何学Linux和它在如今社会的影响

昨天,还在农耕脑力社会,今天已经人工智能技术、大数据、信息技术的科技社会了,高速开展并迅速浸透到当今科技社会的各个方面,Linux日益成为人们信息时代的到来,更加考验我们对信息的处理程...

linux-tao
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部