Java异常体系结构核心解析-Throwable
资料不在于多,而在于精。好资料、好书,我们站在巨人的肩膀上前行,可以少走很多弯路。
通过搜索引擎找到自己需要的最好最权威信息,是一种很重要的能力。
Java源代码和官方资料Java™ Tutorials
Java异常体系结构,是一种分层/层次结构树模型。
异常的根类是 java.lang.Throwable,核心数据结构/模型和实现都在于此类。了解她们对理解异常信息很关键。
其子类 java.lang.Exception、java.lang.RuntimeException、java.lang.Error 都是标签类。
java.lang.Throwable
Throwable 是异常的根类,核心数据结构/模型和实现都在于此类。了解她们对理解异常信息很关键。
/*** The {@code Throwable} class is the superclass of all errors and* exceptions in the Java language. Only objects that are instances of this* class (or one of its subclasses) are thrown by the Java Virtual Machine or* can be thrown by the Java {@code throw} statement. Similarly, only* this class or one of its subclasses can be the argument type in a* {@code catch} clause.** For the purposes of compile-time checking of exceptions, {@code* Throwable} and any subclass of {@code Throwable} that is not also a* subclass of either {@link RuntimeException} or {@link Error} are* regarded as checked exceptions.** <p>Instances of two subclasses, {@link java.lang.Error} and* {@link java.lang.Exception}, are conventionally used to indicate* that exceptional situations have occurred. Typically, these instances* are freshly created in the context of the exceptional situation so* as to include relevant information (such as stack trace data).** @author unascribed* @author Josh Bloch (Added exception chaining and programmatic access to* stack trace in 1.4.)* @jls 11.2 Compile-Time Checking of Exceptions* @since JDK1.0*/
public class Throwable implements Serializable {/*** Specific details about the Throwable.*/private String detailMessage;/*** The throwable that caused this throwable to get thrown, or null if this* throwable was not caused by another throwable, or if the causative* throwable is unknown.*/private Throwable cause = this;/*** The stack trace, as returned by {@link #getStackTrace()}.*/private StackTraceElement[] stackTrace = UNASSIGNED_STACK;/*** The list of suppressed exceptions, as returned by {@link #getSuppressed()}.*/private List<Throwable> suppressedExceptions = SUPPRESSED_SENTINEL;/** Caption for labeling causative exception stack traces */private static final String CAUSE_CAPTION = "Caused by: ";/** Caption for labeling suppressed exception stack traces */private static final String SUPPRESSED_CAPTION = "Suppressed: ";/*** Constructs a new throwable with the specified detail message and* cause. <p>Note that the detail message associated with* {@code cause} is <i>not</i> automatically incorporated in* this throwable's detail message.** <p>The {@link #fillInStackTrace()} method is called to initialize* the stack trace data in the newly created throwable.*/public Throwable(String message, Throwable cause) {fillInStackTrace();detailMessage = message;this.cause = cause;}/*** Returns a short description of this throwable.* The result is the concatenation of:* <ul>* <li> the {@linkplain Class#getName() name} of the class of this object* <li> ": " (a colon and a space)* <li> the result of invoking this object's {@link #getLocalizedMessage}* method* </ul>* If {@code getLocalizedMessage} returns {@code null}, then just* the class name is returned.*/public String toString() {String s = getClass().getName();String message = getLocalizedMessage();return (message != null) ? (s + ": " + message) : s;}private void printStackTrace(PrintStreamOrWriter s) {// Guard against malicious overrides of Throwable.equals by// using a Set with identity equality semantics.Set<Throwable> dejaVu =Collections.newSetFromMap(new IdentityHashMap<Throwable, Boolean>());dejaVu.add(this);synchronized (s.lock()) {// Print our stack traces.println(this);StackTraceElement[] trace = getOurStackTrace();for (StackTraceElement traceElement : trace)s.println("\tat " + traceElement);// Print suppressed exceptions, if anyfor (Throwable se : getSuppressed())se.printEnclosedStackTrace(s, trace, SUPPRESSED_CAPTION, "\t", dejaVu);// Print cause, if anyThrowable ourCause = getCause();if (ourCause != null)ourCause.printEnclosedStackTrace(s, trace, CAUSE_CAPTION, "", dejaVu);}}}
java.lang.StackTraceElement
其中 StackTraceElement 表示调用栈跟踪元素,了解其核心数据结构/模型对理解异常信息也很关键。
/*** An element in a stack trace, as returned by {@link* Throwable#getStackTrace()}. Each element represents a single stack frame.* All stack frames except for the one at the top of the stack represent* a method invocation. The frame at the top of the stack represents the* execution point at which the stack trace was generated. Typically,* this is the point at which the throwable corresponding to the stack trace* was created.** @since 1.4* @author Josh Bloch*/
public final class StackTraceElement implements java.io.Serializable {private String declaringClass;private String methodName;private String fileName;private int lineNumber;/*** Creates a stack trace element representing the specified execution* point.*/public StackTraceElement(String declaringClass, String methodName,String fileName, int lineNumber) {this.declaringClass = Objects.requireNonNull(declaringClass, "Declaring class is null");this.methodName = Objects.requireNonNull(methodName, "Method name is null");this.fileName = fileName;this.lineNumber = lineNumber;}/*** Returns a string representation of this stack trace element. The* format of this string depends on the implementation, but the following* examples may be regarded as typical:* <ul>* <li>* {@code "MyClass.mash(MyClass.java:9)"} - Here, {@code "MyClass"}* is the <i>fully-qualified name</i> of the class containing the* execution point represented by this stack trace element,* {@code "mash"} is the name of the method containing the execution* point, {@code "MyClass.java"} is the source file containing the* execution point, and {@code "9"} is the line number of the source* line containing the execution point.* <li>* {@code "MyClass.mash(MyClass.java)"} - As above, but the line* number is unavailable.* <li>* {@code "MyClass.mash(Unknown Source)"} - As above, but neither* the file name nor the line number are available.* <li>* {@code "MyClass.mash(Native Method)"} - As above, but neither* the file name nor the line number are available, and the method* containing the execution point is known to be a native method.* </ul>* @see Throwable#printStackTrace()*/public String toString() {return getClassName() + "." + methodName +(isNativeMethod() ? "(Native Method)" :(fileName != null && lineNumber >= 0 ?"(" + fileName + ":" + lineNumber + ")" :(fileName != null ? "("+fileName+")" : "(Unknown Source)")));}}
异常日志解读示例
实践出真知识,才能真正地理解!
异常日志解读
com.alibaba.xxx.xxx.common.exception.ServiceException: waybill rule is null by DISTRIBUTOR_30474702at com.alibaba.xxx.xxx.biz.common.WaybillAssistUtils.getExportWaybillRuleDO(WaybillAssistUtils.java:239)第一行日志
com.alibaba.xxx.xxx.common.exception.ServiceException: waybill rule is null by DISTRIBUTOR_30474702
// 参考 java.lang.Throwable#toString
getClass().getName():com.alibaba.xxx.xxx.common.exception.ServiceException
getLocalizedMessage()=detailMessage:waybill rule is null by DISTRIBUTOR_30474702第二行日志at com.alibaba.xxx.xxx.biz.common.WaybillAssistUtils.getExportWaybillRuleDO(WaybillAssistUtils.java:239)
// 参考 java.lang.Throwable#printStackTrace(java.lang.Throwable.PrintStreamOrWriter)
// StackTraceElement[] trace = getOurStackTrace();
// for (StackTraceElement traceElement : trace)
// s.println("\tat " + traceElement);
"\tat ": at
traceElement:com.alibaba.xxx.xxx.biz.common.WaybillAssistUtils.getExportWaybillRuleDO(WaybillAssistUtils.java:239)
// 参考 java.lang.StackTraceElement#toString
getClassName() + "." + methodName:com.alibaba.xxx.xxx.biz.common.WaybillAssistUtils.getExportWaybillRuleDO
getClassName()=declaringClass:com.alibaba.xxx.xxx.biz.common.WaybillAssistUtils
methodName:getExportWaybillRuleDO
"(" + fileName + ":" + lineNumber + ")":(WaybillAssistUtils.java:239)
fileName:WaybillAssistUtils.java
lineNumber:239
进阶阅读资料
- Java语言规范和源代码
- 官方资料Java™ Tutorials - https://docs.oracle.com/javase/tutorial/
- Java™ Tutorials 的 Lesson: Exceptions 对异常体系讲解的通俗易懂 - https://docs.oracle.com/javase/tutorial/essential/exceptions/index.html
祝大家玩得开心!ˇˍˇ
简放,杭州
相关文章:
Java异常体系结构核心解析-Throwable
资料不在于多,而在于精。好资料、好书,我们站在巨人的肩膀上前行,可以少走很多弯路。 通过搜索引擎找到自己需要的最好最权威信息,是一种很重要的能力。 Java源代码和官方资料Java™ Tutorials Java异常体系结构,是一种…...
Android MediaRecorder 相关
Android MediaRecorder 相关 本篇文章主要介绍下MediaRecorder类. 1:创建对象 MediaRecorder mediaRecordernew MediaRecorder();MediaRecorder可以直接通过无参构造直接创建对象. 2: 音频源 通过调用setAudioSource(int audio_source)来设置音频源,可以是麦克风.音频文件…...
Spring中关于事务的一些方方面面
事务隔离级别: 先了解一些事务隔离级别有哪些: 未提交读(Read Uncommitted): 允许脏读,也就是可能读取到其他会话中未提交事务修改的数据 提交读(Read Committed): 只能读取到已经提交的数据。Oracle等多数数据库默…...
LiveQing视频点播流媒体RTMP推流服务功能-支持配置开启 HTTPS 服务什么时候需要开启HTTPS服务
LiveQing视频点播流媒体RTMP推流服务功能支持配置开启 HTTPS 服务什么时候需要开启HTTPS服务 1、配置开启HTTPS1.1、准备https证书1.1.1、选择Nginx类型证书下载 1.2、配置 开启 HTTPS1.2.1 web页面配置1.2.2 配置文件配置 2、验证HTTPS服务3、为什么要开启HTTPS3.1、安全性要求…...
LabVIEW串口通信的激光器模块智能控制
LabVIEW串口通信的激光器模块智能控制 介绍了通过于LabVIEW的VISA串口通信技术在激光器模块控制中的应用。通过研究VISA串口通信的方法和流程,实现了对激光器模块的有效控制,解决了数据发送格式的匹配问题,为激光器模块的智能控制提供了一种…...
全球最受欢迎的DAWFL Studio 21.2.3.4004 中文破解版强悍来袭
1997年是一个「古老」的年代,那时人们还在用「猫」上网,微信、QQ的江湖被ICQ统治,音乐编辑领域 Cool Edit 如日中天。这一年 ,FL Studio 的前身 FruityLoops 在比利时问世,26年来,FL已成长为全球最受欢迎的…...
【uni-app】常用组件和 API
常用组件 uni-app 为开发者提供了一系列基础组件,类似 HTML 里的基础标签元素,但 uni-app 的组件与 HTML 不同,而是与小程序相同,更适合手机端使用。 虽然不推荐使用 HTML 标签,但实际上如果开发者写了div等标签&…...
基于springboot+vue的安康旅游网站(前后端分离)
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 主要内容:毕业设计(Javaweb项目|小程序|Pyt…...
monaco脚本编辑器 在无界中使用 鼠标点击不到
背景A项目使用无界引入B项目 经排查,是B使用的的monaco脚本编辑器无法在A的无界框架中引入的问题。 经查询,需要修改monaco源码来使之能在无界中使用。 解决方案:https://github.com/Tencent/wujie/issues/205。 有三种解决方案: …...
react中修改state中的值无效?
// 初始化state state {personArr:[{name:张三,id:1},{name:李四,id:2},{name:王五,id:3}] }componentDidMount(){const newName 赵六const indexUpdate 1const newArr this.state.personArr.map((item,index)>{if(indexUpdate index){return {...item,name:newName}}e…...
在Node.js中如何实现用户身份验证和授权
当涉及到构建安全的应用程序时,用户身份验证和授权是至关重要的一环。在Node.js中,我们可以利用一些流行的库和技术来实现这些功能,确保我们的应用程序具有所需的安全性。本篇博客将介绍如何在Node.js中实现用户身份验证和授权。 用户身份验…...
QT day2 2.21
1.使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数 代码: #include "mywidget.h" #include "ui_mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(pa…...
说说设备像素、css像素、设备独立像素、dpr、ppi 之间的区别
文章目录 一、背景二、介绍CSS像素设备像素设备独立像素dprppi 三、总结参考文献 一、背景 在css中我们通常使用px作为单位,在PC浏览器中css的1个像素都是对应着电脑屏幕的1个物理像素 这会造成一种错觉,我们会认为css中的像素就是设备的物理像素 但实…...
文生视频Sora
Sora:scalable diffusion models with transformers 文生视频模型 Sora:视频生成模型60s,视频中体现一定的物理逻辑 时空patch,是Sora创新的核心。 Sora 到底是不是物理引擎甚至世界模型?数据驱动的物理引擎 帆船在水里…...
汽车常识网:电脑主机如何算功率的计算方法?
今天汽车知识网就给大家讲解一下如何计算一台主机的功率。 它还会解释如何计算计算机主机所需的功率? ? (如何计算电脑主机所需的功率)进行说明。 如果它恰好解决了您现在面临的问题,请不要忘记关注本站。 让我们现在就…...
c语言常见操作符及操作符优先级
目录 概述1. 算术操作符:2. 关系操作符:3. 逻辑操作符:4. 位操作符: *常见操作符优先级* 概述 C语言中有多种操作符,用于执行不同的操作。下面是一些常见的C语言操作符以及示例代码: 1. 算术操作符&…...
IO进程线程:通信
1.定义互斥锁 #include<myhead.h>int num520;//临界资源//1.创建一个互斥锁变量 pthread_mutex_t mutex;//定义任务1函数 void *task1(void *arg) {printf("11111111111111\n");//3.获取锁资源pthread_mutex_lock(&mutex);num1314;sleep(3);pr…...
神经网络系列---常用梯度下降算法
文章目录 常用梯度下降算法随机梯度下降(Stochastic Gradient Descent,SGD):随机梯度下降数学公式:代码演示 批量梯度下降(Batch Gradient Descent)批量梯度下降数学公式:代码演示 小…...
Flink 的历史版本特性介绍(一)
如果你还不了解 Flink 是什么,可以查看我之前的介绍文章:Flink 介绍 如果你想跟着我一起学习 flink,欢迎查看订阅专栏:Flink 专栏 这篇文章列举了 Flink 每次发布的版本中的重要特性,从中可以看出 Flink 是如何一步一步发展到今天的。 Flink 的前身是 Stratosphere 项目…...
【尚硅谷】MybatisPlus 学习笔记(下)
目录 六、插件 6.1、分页插件 6.1.1、添加配置类 6.1.2、测试 6.2、xml自定义分页 6.2.1、UserMapper中定义接口方法 6.2.2、UserMapper.xml中编写SQL 6.2.3、测试 6.3、乐观锁 6.3.1、场景 6.3.2、乐观锁与悲观锁 6.3.3、模拟修改冲突 数据库中增加商品表 添加数…...
ZYNQ双核通信必看:共享内存的Cache一致性处理实战
ZYNQ双核通信中的Cache一致性实战指南 在嵌入式系统开发中,多核处理器间的数据共享一直是开发者面临的挑战之一。Xilinx ZYNQ系列SoC凭借其ARM双核Cortex-A9架构与可编程逻辑的完美结合,为高性能嵌入式应用提供了强大支持。然而,当两个核心需…...
StabilityGuide故障排查终极指南:从OutOfMemoryError到StackOverFlowError的完整解决方案
StabilityGuide故障排查终极指南:从OutOfMemoryError到StackOverFlowError的完整解决方案 【免费下载链接】StabilityGuide 项目地址: https://gitcode.com/gh_mirrors/st/StabilityGuide StabilityGuide是阿里巴巴开源的系统稳定性知识库,专注于…...
保姆级教程:用YOLOv11+PyQt5打造你的专属天气识别桌面应用(附完整源码)
从零构建基于YOLOv11的智能天气识别桌面应用 窗外阴云密布,你是否曾好奇此刻的天气状况究竟如何?现代计算机视觉技术让机器也能像人类一样"看懂"天气。本文将带你完整实现一个能识别11种天气类型的桌面应用,从模型加载到界面交互&a…...
Adams中利用AKISPL和DX函数实现非线性衬套力建模
1. 非线性衬套力建模的核心价值 在机械系统仿真中,非线性衬套力的精确建模直接影响着悬架、发动机支架等关键部件的动态特性分析精度。传统线性模型难以捕捉橡胶衬套、液压衬套等元件在真实工况下的力-位移关系,而Adams中的AKISPL和DX函数组合就像给工程…...
中国铁路 12306|基于springboot + vue中国铁路 12306购票管理系统(源码+数据库+文档)
中国铁路 12306购票管理系统 目录 基于springboot vue中国铁路 12306购票管理系统 一、前言 二、系统功能演示 详细视频演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取: 基于springboot vue中…...
阿里开源CosyVoice2-0.5B:快速部署声音克隆应用,小白友好教程
阿里开源CosyVoice2-0.5B:快速部署声音克隆应用,小白友好教程 1. 项目简介与核心能力 CosyVoice2-0.5B是阿里开源的一款轻量级语音克隆工具,专为快速部署和简单使用而设计。这个模型最吸引人的特点是: 3秒极速复刻:…...
解锁B站资源:BilibiliDown高效视频下载全方案
解锁B站资源:BilibiliDown高效视频下载全方案 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilibi…...
Shell脚本新手必看:6种方法彻底解决Undefined Variable报错(附代码示例)
Shell脚本变量报错终极指南:从根源解决Undefined Variable问题 在Linux系统管理和自动化运维中,Shell脚本是不可或缺的工具。但许多初学者在编写脚本时,经常会遇到"Undefined Variable"这类看似简单却令人头疼的报错。这种错误不仅…...
开源工具MelonLoader:Unity游戏模组开发的3大突破与零基础上手指南
开源工具MelonLoader:Unity游戏模组开发的3大突破与零基础上手指南 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader …...
比迪丽LoRA模型Mathtype式交互:设计公式化提示词编辑器提升创作精度
比迪丽LoRA模型Mathtype式交互:设计公式化提示词编辑器提升创作精度 不知道你有没有过这样的经历:面对一个功能强大的AI绘画模型,比如集成了各种LoRA的比迪丽,脑子里明明有非常具体的画面,但就是不知道该怎么用文字描…...
