【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
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()
,其源码如下:
从注释可知,此方法的作用是初始化堆栈跟踪信息。
本文持续更新中。。。