文档章节

线程中不可控异常的处理

柳哥
 柳哥
发布于 2015/04/26 12:20
字数 607
阅读 336
收藏 0
点赞 0
评论 0

在Java中有两种异常。

  • 非运行时异常(Checked Exception):这种异常必须在方法声明的throws语句指定,或者在方法体内捕获。例如:IOException和ClassNotFoundException。

  • 运行时异常(Unchecked Exception):这种异常不必在方法声明中指定,也不需要在方法体中捕获。例如,NumberFormatException。

因为run()方法不支持throws语句,所以当线程对象的run()方法抛出非运行异常时,我们必须捕获并且处理它们。当运行时异常从run()方法中抛出时,默认行为是在控制台输出堆栈记录并且退出程序。

好在,java提供给我们一种在线程对象里捕获和处理运行时异常的一种机制。实现用来处理运行时异常的类,这个类实现UncaughtExceptionHandler接口并且实现这个接口的uncaughtException()方法。示例:

package concurrency;

import java.lang.Thread.UncaughtExceptionHandler;

public class Main2 {
    public static void main(String[] args) {
        Task task = new Task();
        Thread thread = new Thread(task);
        thread.setUncaughtExceptionHandler(new ExceptionHandler());
        thread.start();
    }
}

class Task implements Runnable{
    @Override
    public void run() {
        int numero = Integer.parseInt("TTT");
    }
}

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

当一个线程抛出了异常并且没有被捕获时(这种情况只可能是运行时异常),JVM检查这个线程是否被预置了未捕获异常处理器。如果找到,JVM将调用线程对象的这个方法,并将线程对象和异常作为传入参数。

Thread类还有另一个方法可以处理未捕获到的异常,即静态方法setDefaultUncaughtExceptionHandler()。这个方法在应用程序中为所有的线程对象创建了一个异常处理器。

当线程抛出一个未捕获到的异常时,JVM将为异常寻找以下三种可能的处理器。首先,它查找线程对象的未捕获异常处理器。如果找不到,JVM继续查找线程对象所在的线程组(ThreadGroup)的未捕获异常处理器(线程组后面blog在讲解)。如果还是找不到,如同本节所讲的,JVM将继续查找默认的未捕获异常处理器。如果没有一个处理器存在,JVM则将堆栈异常记录打印到控制台,并退出程序。


© 著作权归作者所有

共有 人打赏支持
柳哥
粉丝 201
博文 394
码字总数 347782
作品 0
杭州
技术主管
JAVA7并发编程

1线程的创建与运行 接口Runnable 覆盖run方法 线程信息 thread中包含id name priorty status priorty中包括1到10,1最低,10最高 status状态有6种:new, runnable, blocked, waiting, time wa...

jiangmitiao ⋅ 2015/06/11 ⋅ 0

分页爬虫线程模型

1、1个主线程+1个列表线程+N个明细线程 对要爬取的网站数据,基本是采用分页的形式展现,通过遍历列表解析明细URL,进而爬取明细页面内容; 每个网站一个处理线程,爬取列表和爬取明细采用单...

无知有趣 ⋅ 2015/08/08 ⋅ 1

华为手机或平板频繁出现的OOM异常

最近做平板应用,需要做一个循环扫描局域网IP端口的功能,实现原理是开一个线程池,然后将250个ping的线程加入其中开始运行,部分代码如下: 在其他机型上运行都无异常,华为设备上已有三例不...

Vonelone ⋅ 03/17 ⋅ 0

Java常用异常整理

填坑,整理下Java的常用异常。正确使用异常在实际编码中非常重要,但面试中的意义相对较小,因为对异常的理解和应用很难通过几句话或几行代码考查出来,不过我们至少应答出三点:异常类的继承...

monkeysayhi ⋅ 2017/11/14 ⋅ 0

线程组中不可控异常的处理

Java示例: package concurrency; import java.util.Random; public class Main6 { public static void main(String[] args) { MyThreadGroup threadGroup = new MyThreadGroup("MyThreadGro......

柳哥 ⋅ 2015/05/03 ⋅ 0

网络-BIO-伪异步I/O

为了解决同步阻塞I/O面临的一个链路需要一个线程处理的问题,后来有人对它的线程模型进行了优化,后端通过一个线程池来处理多个客户端的请求接入,形成客户端个数M:线程池最大线程数N的比例...

xyh12344 ⋅ 2015/12/21 ⋅ 0

checked exception 和 unchecked exception的区别浅见

java 中的异常有一种区别方式:checked exception和unchecked exception; unchecked exception继承自RuntimeException; checked exception继承自Exception; 我认为这两者的区别在于,unc...

豆腐干123 ⋅ 2014/06/25 ⋅ 0

NIO入门之伪异步I/O编程

为了解决同步阻塞I/O面临的一个链路需要一个线程处理的问题,后来有人对它的线程模型进行了优化,后端通过一个线程池来处理多个客户端的请求接入,形成客户端个数M:线程池最大线程数N的比例...

柳哥 ⋅ 2015/01/19 ⋅ 4

java并发编程实战------阅读笔记第六章结构化并发应用程序---任务执行

一、在线程中执行任务1.1 串行执行任务:例如手写一个串行执行的web服务器程序,串行接收请求。1.2 显式为任务创建线程:每个任务一个线程会消耗大量资源1.3 无限制创建线程的不足:线程生命...

treenewtreenew ⋅ 2016/11/08 ⋅ 0

老问题,netty的固定个数的worker线程阻塞大量的并发连接

小弟正在做一个大批量的联机交易系统, 对netty正在熟悉中. 由于一直认为,使用cachedThreadPool不方便控制大量客户端恶意并发连接的风险,给我一种不可控的感觉,所以在启动NIO server时,我一直...

xinglu ⋅ 2012/03/06 ⋅ 16

没有更多内容

加载失败,请刷新页面

加载更多

下一页

十五周二次课

十五周二次课 17.1mysql主从介绍 17.2准备工作 17.3配置主 17.4配置从 17.5测试主从同步 17.1mysql主从介绍 MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主...

河图再现 ⋅ 51分钟前 ⋅ 0

docker安装snmp rrdtool环境

以Ubuntu16:04作为基础版本 docker pull ubuntu:16.04 启动一个容器 docker run -d -i -t --name flow_mete ubuntu:16.04 bash 进入容器 docker exec -it flow_mete bash cd ~ 安装基本软件 ......

messud4312 ⋅ 今天 ⋅ 0

OSChina 周一乱弹 —— 快别开心了,你还没有女友呢。

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享吴彤的单曲《好春光》 《好春光》- 吴彤 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :小萝莉街上乱跑,误把我认错成...

小小编辑 ⋅ 今天 ⋅ 7

mysql in action / alter table

change character set ALTER SCHEMA `employees` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci ;ALTER TABLE `employees`.`t2` CHARACTER SET = utf8mb4 , COLLAT......

qwfys ⋅ 今天 ⋅ 0

Java 开发者不容错过的 12 种高效工具

Java 开发者常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用...

jason_kiss ⋅ 昨天 ⋅ 0

Linux下php访问远程ms sqlserver

1、安装freetds(略,安装在/opt/local/freetds 下) 2、cd /path/to/php-5.6.36/ 进入PHP源码目录 3、cd ext/mssql进入MSSQL模块源码目录 4、/opt/php/bin/phpize生成编译配置文件 5、 . ./...

wangxuwei ⋅ 昨天 ⋅ 0

如何成为技术专家

文章来源于 -- 时间的朋友 拥有良好的心态。首先要有空杯心态,用欣赏的眼光发现并学习别人的长处,包括但不限于工具的使用,工作方法,解决问题以及规划未来的能力等。向别人学习的同时要注...

长安一梦 ⋅ 昨天 ⋅ 0

Linux vmstat命令实战详解

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令...

刘祖鹏 ⋅ 昨天 ⋅ 0

MySQL

查看表相关命令 - 查看表结构    desc 表名- 查看生成表的SQL    show create table 表名- 查看索引    show index from  表名 使用索引和不使用索引 由于索引是专门用于加...

stars永恒 ⋅ 昨天 ⋅ 0

easyui学习笔记

EasyUI常用控件禁用方法 combobox $("#id").combobox({ disabled: true }); ----- $("#id").combobox({ disabled: false}); validatebox $("#id").attr("readonly", true); ----- $("#id").r......

miaojiangmin ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部