Throwable

  • 属性说明
/**
* Java 语言中所有错误和异常的基类,此类及其子类才能通过 throws 被 JVM 虚拟机抛出。
* @since 1.0
*/
public class Throwable implements Serializable {
/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = -3042686055658047285L; /**
* JVM 会保存一些栈回溯信息到此对象上
*/
private transient Object backtrace; /**
* 异常的细节信息
*/
private String detailMessage; /**
* 共享的空堆栈信息
*/
private static final StackTraceElement[] UNASSIGNED_STACK = new StackTraceElement[0]; /**
* 引起此 Throwable 抛出的源 Throwable 对象
* @since 1.4
*/
private Throwable cause = this; /**
* 此 Throwable 关联的堆栈信息
* @serial
* @since 1.4
*/
private StackTraceElement[] stackTrace = UNASSIGNED_STACK; /**
* 栈回溯的深度
*/
private transient int depth; // Setting this static field introduces an acceptable
// initialization dependency on a few java.util classes.
private static final List<Throwable> SUPPRESSED_SENTINEL = Collections.emptyList(); /**
* 被抑制的异常对象列表
* @serial
* @since 1.7
*/
private List<Throwable> suppressedExceptions = SUPPRESSED_SENTINEL; /** 用于抑制空指针异常的消息 */
private static final String NULL_CAUSE_MESSAGE = "Cannot suppress a null exception."; /** Message for trying to suppress oneself. */
private static final String SELF_SUPPRESSION_MESSAGE = "Self-suppression not permitted"; /** 导致异常堆栈跟踪的标题信息 */
private static final String CAUSE_CAPTION = "Caused by: "; /** 被抑制的异常堆栈跟踪的标题信息 */
private static final String SUPPRESSED_CAPTION = "Suppressed: ";
  • 实例化
    /**
* 创建一个无描述信息的 Throwable 对象
*/
public Throwable() {
fillInStackTrace();
} /**
* 创建一个持有指定描述信息 message 的 Throwable 对象
* @param message 详细的信息
*/
public Throwable(String message) {
fillInStackTrace();
detailMessage = message;
} /**
* 创建一个持有详细信息和异常来源的 Throwable 对象
* @param message 详细描述信息
* @param cause 引起此 Throwable 的源 Throwable 对象
* @since 1.4
*/
public Throwable(String message, Throwable cause) {
fillInStackTrace();
detailMessage = message;
this.cause = cause;
} /**
* 创建一个持有源 Throwable 实例的 Throwable 对象
*
* @param cause 源 Throwable 对象
* @since 1.4
*/
public Throwable(Throwable cause) {
fillInStackTrace();
detailMessage = cause==null ? null : cause.toString();
this.cause = cause;
} /**
* 填充此 Throwable 实例的堆栈跟踪信息
*/
public synchronized Throwable fillInStackTrace() {
if (stackTrace != null ||
backtrace != null /* Out of protocol state */ ) {
fillInStackTrace(0);
stackTrace = UNASSIGNED_STACK;
}
return this;
} private native Throwable fillInStackTrace(int dummy);
  • 打印异常堆栈
    /**
* 将异常堆栈信息输出到标准错误流
*/
public void printStackTrace() {
printStackTrace(System.err);
} /**
* 将此 Throwable 的堆栈信息输出到指定的 PrintStream s 中
*
* @param s 用于输出的目标 {@code PrintStream}
*/
public void printStackTrace(PrintStream s) {
printStackTrace(new WrappedPrintStream(s));
} private void printStackTrace(PrintStreamOrWriter s) {
final Set<Throwable> dejaVu = Collections.newSetFromMap(new IdentityHashMap<>());
dejaVu.add(this); synchronized (s.lock()) {
// 打印此 Throwable 的信息
s.println(this);
// 打印相关的堆栈信息
final StackTraceElement[] trace = getOurStackTrace();
for (final StackTraceElement traceElement : trace) {
s.println("\tat " + traceElement);
} // 打印抑制的异常信息
for (final Throwable se : getSuppressed()) {
se.printEnclosedStackTrace(s, trace, SUPPRESSED_CAPTION, "\t", dejaVu);
} // 打印异常原因
final Throwable ourCause = getCause();
if (ourCause != null) {
ourCause.printEnclosedStackTrace(s, trace, CAUSE_CAPTION, "", dejaVu);
}
}
} /**
* 将此 Throwable 的堆栈信息打印到 PrintWriter s 中
*
* @param s 用于输出的 {@code PrintWriter}
* @since 1.1
*/
public void printStackTrace(PrintWriter s) {
printStackTrace(new WrappedPrintWriter(s));
} /**
* 封装 PrintStream and PrintWriter
*/
private abstract static class PrintStreamOrWriter {
/** Returns the object to be locked when using this StreamOrWriter */
abstract Object lock(); /** Prints the specified string as a line on this StreamOrWriter */
abstract void println(Object o);
} private static class WrappedPrintStream extends PrintStreamOrWriter {
private final PrintStream printStream; WrappedPrintStream(PrintStream printStream) {
this.printStream = printStream;
} @Override
Object lock() {
return printStream;
} @Override
void println(Object o) {
printStream.println(o);
}
} private static class WrappedPrintWriter extends PrintStreamOrWriter {
private final PrintWriter printWriter; WrappedPrintWriter(PrintWriter printWriter) {
this.printWriter = printWriter;
} @Override
Object lock() {
return printWriter;
} @Override
void println(Object o) {
printWriter.println(o);
}
}

Throwable 源码阅读的更多相关文章

  1. 源码阅读系列:EventBus

    title: 源码阅读系列:EventBus date: 2016-12-22 16:16:47 tags: 源码阅读 --- EventBus 是人们在日常开发中经常会用到的开源库,即使是不直接用的 ...

  2. EventBus源码解析 源码阅读记录

    EventBus源码阅读记录 repo地址: greenrobot/EventBus EventBus的构造 双重加锁的单例. static volatile EventBus defaultInst ...

  3. Bean实例化(Spring源码阅读)-我们到底能走多远系列(33)

    我们到底能走多远系列(33) 扯淡: 各位:    命运就算颠沛流离   命运就算曲折离奇   命运就算恐吓着你做人没趣味   别流泪 心酸 更不应舍弃   ... 主题: Spring源码阅读还在继 ...

  4. Netty源码阅读(一) ServerBootstrap启动

    Netty源码阅读(一) ServerBootstrap启动 转自我的Github Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速 ...

  5. 初始化IoC容器(Spring源码阅读)

    初始化IoC容器(Spring源码阅读) 我们到底能走多远系列(31) 扯淡: 有个问题一直想问:各位你们的工资剩下来会怎么处理?已婚的,我知道工资永远都是不够的.未婚的你们,你们是怎么分配工资的? ...

  6. Spark源码阅读之存储体系--存储体系概述与shuffle服务

    一.概述 根据<深入理解Spark:核心思想与源码分析>一书,结合最新的spark源代码master分支进行源码阅读,对新版本的代码加上自己的一些理解,如有错误,希望指出. 1.块管理器B ...

  7. Mina源码阅读笔记(四)—Mina的连接IoConnector2

    接着Mina源码阅读笔记(四)-Mina的连接IoConnector1,,我们继续: AbstractIoAcceptor: 001 package org.apache.mina.core.rewr ...

  8. Spring源码阅读笔记

    前言 作为一个Java开发者,工作了几年后,越发觉力有点不从心了,技术的世界实在是太过于辽阔了,接触的东西越多,越感到前所未有的恐慌. 每天捣鼓这个捣鼓那个,结果回过头来,才发现这个也不通,那个也不精 ...

  9. Rpc框架dubbo-client(v2.6.3) 源码阅读(二)

    接上一篇 dubbo-server 之后,再来看一下 dubbo-client 是如何工作的. dubbo提供者服务示例, 其结构是这样的!dubbo://192.168.11.6:20880/com ...

随机推荐

  1. The basic concept of information theory.

    Deep Learning中会接触到的关于Info Theory的一些基本概念.

  2. VS2008配合SQLite开发WINCE、PDA智能设备项目环境搭设。

    1.安装vs2008 ---------------------------vs2008上安装TFS步骤(详细请见——http://www.cnblogs.com/mayt/archive/2013/ ...

  3. 关于first-class object的解释

    关于first-class object的解释 定义,什么是编程语言的第一等公民? In computer science, a programming language is said to hav ...

  4. nginx基本概述

    上级回顾: 1.NFS 2.Sersync 3.SSH 1.ssh使用两种登录服务器的方式,哪两种? 密码 用户名 + 密码 秘钥 用户名 + 秘钥(私钥) 公钥加密 私钥解密 2.大家常说的 塞ke ...

  5. Linux磁盘分区的实用管理命令

    系统环境:Centos6.7 命令信息: 1.lsblk  列出分区信息,可以查看分区的光在目录和使用情况  (读取内存中的分区表信息) 2.fdisk 用来创建MBR分区(也可以创建GPT分区,但是 ...

  6. 【Share Code | HTML & CSS & Javascript】动画片段幻灯片

    [查看demo & 下载资源](https://zhaoshuquan.com/posts/15 介绍 本文使用"Pieces"库轻松实现动画片段幻灯片效果. 今天我们想向 ...

  7. mongodb 批量添加、修改和删除

    1.使用MongoTemplate a.批量插入 Insert a Collection of objects into a collection in a single batch write to ...

  8. Jmeter接口测试+压力测试(转)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/github_27109687/artic ...

  9. V2018.5 MB SD C4功能和软件详细信息更新

    MB SD C4 现在更新为V2018.5版本.功能和HDD Xentry软件信息如下: V2018.5 MB SD C4 功能: 支持无线诊断: 支持K线诊断,CAN BUS和UDS诊断协议.(旧的 ...

  10. GDIPlus的使用准备工作

    GDIPlus的使用 stdafx.h加入如下代码: #include <comdef.h>//初始化一下com口 #include "GdiPlus.h" using ...