Java-API简析_java.lang.Throwable类(基于 Latest JDK)(浅析源码)

news/2025/2/19 17:31:32/

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
https://blog.csdn.net/m0_69908381/article/details/131367906
出自【进步*于辰的博客】

其实我的【Java-API】专栏内的博文对大家来说意义是不大的。因为暂且没有源码讲解,而且需要看Java-API,直接看Java-API文档就行了,也不用看博文。所以呢,这篇博文主要是写给我自己看的,也就是Java-API笔记。
因为我发现目前,我对Java-API的学习意识比较薄弱,需要慢慢习惯使用Java-API,乃至剖析源码来提升自己的源码阅读能力和编码素质。
大家如果需要Java-API文档,我上传了【https://download.csdn.net/download/m0_69908381/87691693】。

文章目录

  • 1、概述
  • 2、构造方法摘要
    • 2.1 null
    • 2.2 String message
    • 2.3 String message, Throwable cause
    • 2.4 Throwable cause
    • 2.5 说明

1、概述

所有已实现的接口:
Serializable

直接已知子类:
Error、Exception


public class Throwable extends Object implements Serializable

Throwable 类是 Java 语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出。类似地,只有此类或其子类之一才可以是 catch 子句中的参数类型。

两个子类的实例,Error 和 Exception,通常用于指示发生了异常情况。通常,这些实例是在异常情况的上下文中新近创建的,因此包含了相关的信息(比如堆栈跟踪数据)。

Throwable 包含了其线程创建时线程执行堆栈的快照。它还包含了给出有关错误更多信息的消息字符串。最后,它还可以包含 cause原因):另一个导致此 throwable 抛出的 throwable。此 cause 设施在 1.4 版本中首次出现。它也称为异常链 设施,因为 cause 自身也会有 cause,依此类推,就形成了异常链,每个异常都是由另一个异常引起的。

导致 throwable cause 的一个理由是, 抛出它的类构建在低层抽象之中,而高层操作由于低层操作的失败而失败。让低层抛出的 throwable 向外传播是一种糟糕的设计方法,因为它通常与高层提供的抽象不相关。此外,这样做将高层 API 与其实现细节关联起来,假定低层异常是经过检查的异常。抛出“经过包装的异常”(即包含 cause 的异常)允许高层与其调用方交流失败详细信息,而不会招致上述任何一个缺点。这种方式保留了改变高层实现而不改变其 API 的灵活性(尤其是,异常集合通过其方法抛出)。

导致 throwable cause 的另一个 cause 是, 抛出它的方法必须符合通用接口,而通用接口不允许方法直接抛出 cause。例如,假定持久集合符合 Collection 接口,而其持久性在 java.io 的基础上实现。假定 put() 方法的内部可以抛出 IOException。实现可以与其调用方交流 IOException 的详细消息,同时通过以一种合适的未检查的异常来包装 IOException,使其符合 Collection 接口。(持久集合的规范应该指示它能够抛出这种异常。

Cause 可以通过两种方式与 throwable 关联起来:通过一个将 cause 看作参数的构造方法;或者通过 initCause(Throwable)(见下文) 方法。对于那些希望将 cause 与其关联起来的新 throwable 类,应该提供带有 cause 的构造方法,并委托(可能间接)给一个带有 cause 的 Throwable 构造方法。例如:

try {lowLevelOp();
} catch (LowLevelException le) {throw new HighLevelException(le);  // Chaining-aware constructor
}

因为 initCause() 方法是公共的,它允许 cause 与任何 throwable 相关联,甚至包括“遗留 throwable”,它的实现提前将异常链机制的附件应用到 Throwable。例如:

try{lowLevelOp();
} catch (LowLevelException le) {throw (HighLevelException)new HighLevelException().initCause(le);  // Legacy constructor
}

在版本 1.4 之前,许多 throwable 有自己的非标准异常链机制( ExceptionInInitializerError、 ClassNotFoundException、 UndeclaredThrowableException、 InvocationTargetException、 WriteAbortedException、 PrivilegedActionException、 PrinterIOException、 RemoteException 和 NamingException)。所有这些 throwable 都已经更新过,可以使用标准异常链机制,同时继续实现其“遗留”链机制,以保持兼容性。

此外,从版本 1.4 开始,许多通用的 Throwable 类(例如,Exception、RuntimeException、Error)都已经更新,具有带 cause 的构造方法。由于有 initCause() 方法存在,这不是严格要求的,但它更方便,也更形象地委托给一个带有 cause 的构造方法(即super())。

根据惯例,Throwable 类及其子类有两个构造方法,一个不带参数,另一个带有 String 参数,此参数可用于生成详细消息。此外,这些子类很可能有与其相关联的 cause,因此也应有两个构造方法,一个带 Throwable (cause),一个带 String(详细消息)和 Throwable (cause)

在版本 1.4 中还引入了getStackTrace()方法,它允许通过各种形式的printStackTrace()方法编程访问堆栈跟踪信息,这些信息以前只能以文本形式使用。此信息已经添加到该类的序列化表示形式,因此 getStackTrace()printStackTrace() 将可在反序列化时获得的 throwable 上正确操作。

从以下版本开始:
JDK1.0
另请参见:
序列化表格

2、构造方法摘要

2.1 null

构造一个null 作为其详细消息的新 throwable。
说明:
看源码。
在这里插入图片描述

2.2 String message

构造带指定详细消息的新 throwable。
说明:
看源码。
在这里插入图片描述

2.3 String message, Throwable cause

构造一个带指定详细消息原因的新 throwable。
说明:
看源码。
在这里插入图片描述

2.4 Throwable cause

构造一个带指定 cause 和 (cause == null ? null :cause.toString())(它通常包含类和 cause 的详细消息)的详细消息的新 throwable。
说明:
看源码。
在这里插入图片描述

2.5 说明

可见,4个构造方法皆调用了fillInStackTrace(),其源码如下:
在这里插入图片描述
从注释可知,此方法的作用是初始化堆栈跟踪信息


本文持续更新中。。。


http://www.ppmy.cn/news/565445.html

相关文章

基于SRE的slo与sli设计

运行评价记录 null 维度容量volume可用性availability延迟latency错误率errors工单tickets每日总请求数tps峰值整体可用率90分位值(ms)95分位值(ms)5xx(%)人工介入数slo10000020099.965507500.040日期1       日期2        slo推演 服务等级目标slo错误预算er…

助力千亿级市场 阿里云进军智能电动车产业

阿里云联合天猫电动车趋势发布会暨产业智能峰会召开,现场数百家电动车企共同探讨二轮电动车行业发展新趋势。泰比特作为天猫电动车的软硬件服务商也参加了此次峰会,会上,阿里云IOT联合天猫共同提出了电动车智能出行解决方案,帮助电…

什么牌子的电动车跑得远?这篇文章告诉你答案

现在很多人的代步工具都是电动车,可以说电动车已经彻底融入我们的生活了,但是最近到了严寒季节,很多人的电动车都出现了续航不够、充不满电、虚标虚电等情况,非常影响日常的出行。对此,选择一款续航足够远的电动车在这…

蓝牙技术|一文带你了解电动车蓝牙钥匙

经历了十几年的飞速发展,据不完全统计,目前我国电动车生产企业有500多家,分布在10多个省市。综合而言,我国电动车生产厂家和品牌繁多,但是存在较为严重的无序竞争现象。对于电动车行业的发展来说,人民生活水…

【JUC进阶】04. 无锁CAS

目录 1、前言 2、CAS概念和原理 2.1、什么是CAS 2.2、CAS原理 2.3、工作方式 2.4、无锁CAS优势 3、unsafe类 4、ABA问题 4.1、什么是ABA问题 4.2、解决ABA问题 4.2.1、版本号机制 4.2.2、AtomicStampReference 5、CAS适用的场景 1、前言 无锁的Compare and Swap&…

20180608 电动车发展

在燃油汽车火速发展之前,电动汽车就以及存在于市场上,但是由于电池本身特性的局限,并未大量普及。现在,传统燃油汽车由于能源的局限性,作为对环境相对友好的新能源汽车,电动车,又重新被大众关注…

Java 使用log4j2记录日志

文章目录 1. Java代码2. Maven依赖3. log4j2.xml配置文件4. 配置项说明4.1 <Configuration>4.2 <Properties>4.3 <Appenders>4.3.1 RollingFile4.3.2 Console4.3.3 File 4.4 <Loggers> 5. 其它说明5.1 日志级别5.2 日志格式化参数5.3 日志级别过滤5.4 …

solr快速上手:整合spring-data-solr实现客户端操作(十)

0. 引言 前一章介绍了官方的solr客户端SolrJ&#xff0c;但是solrJ的使用相对来说并不方便&#xff0c;仍然需要做一些负责的客户端操作以及语句的书写&#xff0c;有没有更加方便的ORM框架呢&#xff0c;这就提到了spring-data-solr了 1. 简介 首先如果你还不知道spring-da…