zl程序教程

您现在的位置是:首页 >  后端

当前栏目

《Java程序员面试秘笈》—— 1.9 线程中不可控异常的处理

2023-09-11 14:17:37 时间

本节书摘来异步社区《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

如果线程没有被预置未捕获异常处理器,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月上线运营。公众号【异步图书】,每日赠送异步新书。