《Java程序员面试秘笈》—— 1.9 线程中不可控异常的处理
本节书摘来异步社区《Java 7并发编程实战手册》一书中的第1章,第1.9节,作者:【西】Javier Fernández González,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.9 线程中不可控异常的处理在Java中有两种异常。
◆ 非运行时异常(Checked Exception):这种异常必须在方法声明的throws语句指定,或者在方法体内捕获。例如:IOException和ClassNotFoundException。
◆ 运行时异常(Unchecked Exception):这种异常不必在方法声明中指定,也不需要在方法体中捕获。例如:NumberFormatException。
因为run()方法不支持throws语句,所以当线程对象的run()方法抛出非运行异常时,我们必须捕获并且处理它们。当运行时异常从run()方法中抛出时,默认行为是在控制台输出堆栈记录并且退出程序。
好在,Java提供给我们一种在线程对象里捕获和处理运行时异常的一种机制。
在本节中,我们将通过范例学习这种机制。
准备工作
本节的范例是在Eclipse IDE里完成的。无论你使用Eclipse还是其他的IDE(比如NetBeans),都可以打开这个IDE并且创建一个新的Java工程。
范例实现
按照接下来的步骤实现本节的范例。
1.实现用来处理运行时异常的类。这个类实现UncaughtExceptionHandler接口并且实现这个接口的uncaughtException()方法。我们的范例将使用ExceptionHandler类的uncaughtException()方法打印出异常信息和抛出异常的线程代码。代码如下:
public class ExceptionHandler implements UncaughtExceptionHandler{ 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()); 2.实现一个抛出运行时异常的线程类,命名为Task,它实现了Runnable接口,在实现run()方法时强制抛出运行时异常。例如,把一个String值转换成int值。
public class Task implements Runnable {
@Override
public void run() {
int numero=Integer.parseInt("TTT");
}
}`
3.实现范例的主程序。实现一个包含main()方法的Main类。
public class Main { public static void main(String[] args) {``` 4.创建一个Task对象,并用它作为传入参数来创建一个Thread对象。接着调用setUncaughtExceptionHandler()方法设置线程的运行时异常处理器,然后启动这个线程。
Task task=new Task(); Thread thread=new Thread(task); thread.setUncaughtExceptionHandler(new ExceptionHandler()); thread.start();
}
}`
5.运行范例并查看运行结果。
工作原理
下面的截屏记录了范例的运行结果。当异常抛出并被异常处理器捕获后,将在控制台打印出异常信息和抛出异常的线程代码。
当一个线程抛出了异常并且没有被捕获时(这种情况只可能是运行时异常),JVM检查这个线程是否被预置了未捕获异常处理器。如果找到,JVM将调用线程对象的这个方法,并将线程对象和异常作为传入参数。
![c2f6ea34446d8cff8c97e724fb106ab9eeba5b3d](https://yqfile.alicdn.com/c2f6ea34446d8cff8c97e724fb106ab9eeba5b3d.png)
如果线程没有被预置未捕获异常处理器,JVM将打印堆栈记录到控制台,并退出程序。
更多信息
Thread类还有另一个方法可以处理未捕获到的异常,即静态方法setDefaultUncaught ExceptionHandler()。这个方法在应用程序中为所有的线程对象创建了一个异常处理器。
当线程抛出一个未捕获到的异常时,JVM将为异常寻找以下三种可能的处理器。
首先,它查找线程对象的未捕获异常处理器。如果找不到,JVM继续查找线程对象所在的线程组(ThreadGroup)的未捕获异常处理器,这将在“线程组中不可控异常的处理”一节中讲解。如果还是找不到,如同本节所讲的,JVM将继续查找默认的未捕获异常处理器。
如果没有一个处理器存在,JVM则将堆栈异常记录打印到控制台,并退出程序。
差点跳起来了!全靠这份999页Java面试宝典,我刚拿到美团offer 事情是这样的,今年年初,在某个大博主那里拿到一份Java面试宝典,然后就一直躺在盘里吃灰,直到5月份的时候,有了要跳槽的计划和打算,就想着要刷刷面试题,所以就把这套“积灰”的面试宝典拿出看了看,这一看就看了一个多月才算是完整的吃透。7月中旬开始面试美团了,前后差不多5面的样子,原本以为没啥希望,等到月底29号收到了offer,通知8月3号到公司报到,看到邮件那一刻差点跳起来了!
987页的Java面试宝典,看完才发现,应届生求职也没那么难 现在已经九月底,金九银十也已经过去了一大半,很明显今年的面试季明显不如往年火热,对于求职者来说,也更难了一些。马上迎来国庆节,假期一过,十月份又过去了三分之一,综合来看今年确实不是面试的最佳时期,不过趁今年所剩的时间来好好准备,明年的金三银四或许会顺利得多。不过,对于今年的应届生来说,等到明年再去面试,竞争就更大了。
全网首发“Java面试考点大全”,20+互联网公司,应有尽有 受疫情影响,今年似乎给人感觉时间比往年还要流逝得更快。显然,春节一过,我们又将迎来面试旺季金三银四。对于程序员来说,秋招的失利更意味着在金三银四要打一场“硬战”,可又有多少人做好了面试的准备呢?对于一线互联网公司的面试,你又了解多少呢?
系统梳理面试6大专题,阿里爆款Java面试速成笔记也太香了 每年的金三银四马上又要到了,相信有很多人都在准备面试了。我们都知道想要在金三银四面试跳槽肯定是要预先投简历的,不知道大家的简历投得怎么样了。反正我最近是收到很多粉丝的私信说自己投了简历却杳无音信,在第一关就败下阵来。(不瞒大家说这里楼主是有点幸灾乐祸的,哈哈)
进阶面试皆宜!阿里强推Java程序员进阶笔记,差距不止一点点 程序员要如何成长这个问题,一直是各大网站、论坛的热点。对此网络上众说纷纭,一千个读者里面就有一千个哈姆雷特。LZ觉得想要让个人技能成长速度,大于公司规模或业务的成长速度,不断优化自己,成为一名“不错”的程序员主要需要掌握以下学习方法与实战技巧。
硬核!阿里出品2023版Java架构师面试指南,涵盖Java所有核心技能 最近很多粉丝朋友私信我说:熬过了去年的寒冬却没熬过现在的内卷;打开Boss直拒一排已读不回,回的基本都是外包,薪资还给的不高,对技术水平要求也远超从前;感觉Java一个初中级岗位有上千人同时竞争,内卷程度简直怀疑人生。
真香!阿里最新出品Java面试核心讲(终极版),Github已星标50K 程序员面试背八股,可以说是现在互联网开发岗招聘不可逆的形式了,其中最卷的当属Java!(网上动不动就是成千上百道的面试题总结)你要是都能啃下来,平时技术不是太差的话,面试基本上问题就不会太大。
异步社区 异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
相关文章
- Win10 JAVA安装及环境搭建(windows jdk,windows java环境配置)
- Word处理控件Aspose.Words功能演示:使用 Java 将文本转换为 PDF
- 【JAVA】如何通过ecplise【调试】,一步一步跟踪检查!(分步图示)
- hive使用python脚本导致java.io.IOException: Broken pipe异常退出
- Java if判断对象为null时,null放在比较运算符的左边还是右边?哪种才是java标准?进来看看你就知道了
- java.lang.ArrayStoreException异常
- 字节首席架构师整合面试痛点,成就 399 页 Java 框架核心宝典
- 八股文系列:Java中的异常和错误
- Java详解,java后端应届生面试题
- java: 无效的目标发行版: 11
- 34 异常机制 异常体系结构 Java把异常当做对象来处理 并定义一个基类java.lang.Throwable作为所有异常的超类 Error Exception
- 【Java】【异常排查】java.lang.NoClassDefFoundError 完美解决
- 第33节:Java面向对象中的异常
- 第二十三节:Java语言基础-详细讲解函数与数组
- 第八节:详细讲解Java中的异常处理情况与I/O流的介绍以及类集合框架
- 第七节:详细讲解Java中的日期,java.util.date
- 第七节:详细讲解Java中的日期,java.util.date
- java 异常
- 《Java程序员面试秘笈》—— 1.12 线程组中不可控异常的处理
- 基于 Java(SpringBoot+SSM)+MySQL 实现的(Web)高校成绩分析与管理系统【100010579】
- java连接oracle jdbc连接
- Java学习-086-Springboot 自定义启动 banner 信息
- Java编程常用数据转换:String与int互转、Date与String互转、BigDecimal与int比较(报错operator > cannot be applied to java.math.BigDecimal,int)
- Java之throw和throws的区别及java中的异常处理
- Java基础-封装基础知识和拓展
- 【JAVA】Exception in thread "main" java.lang.NoClassDefFoundError
- java面向对象编程——封装
- 【Java】日志输出自定义变量值
- Memcached Java Client with sample program--reference
- JAVA异常