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. MySQL数据库笔记二:数据类型及数据库操作

    三.MySQL数据库数据类型 MySQL数据库中支持多种数据类型:数值型.字符型.日期型 常用的数据类型: 1.整型 int:整形,存储整数 int(M):M表示预期值.与存储大小和数值的范围无关. ...

  2. How to mount remote windows partition (windows share) under Linux

    http://www.cyberciti.biz/tips/how-to-mount-remote-windows-partition-windows-share-under-linux.html  ...

  3. Linux下源码编译安装MySql,centeros7

    1. 安cmake工具 # yum install -y cmake 2. 创建mysql用户  #useradd -s /sbin/nologin mysql  //设置为非登陆用户(安全) 3. ...

  4. 使用ViewFlipper实现图片轮播

    public class MainActivity extends AppCompatActivity { private ViewFlipper flipper; //背景图片int[] id pr ...

  5. Spring mvc 初始化过程

    1.DispatcherServlet:获取servlet的name 2.XmlWebApplicationContext:获取contentConfigLocation的xml名称和namespac ...

  6. Gym - 101908J Joining Capitals (斯坦纳树)

    题意:二维平面上有n(n<=100)个点,其中k个是星星(k<=10),现要构造一棵树,每个星星对应树上的一个叶子结点,求最小花费(总花费为树上所有边的长度(两点间欧几里得距离)) 斯坦纳 ...

  7. 将 对象序列化与反序化 (json格式)

    实体类 package com.nf.redisDemo1.entity; public class News { private long id; private String title; pri ...

  8. nginx 缓存,大文件分片请求方法

    实现的途径:expire cache-control 更新缓存的机制 如何校验本地缓存是否过期 expires cache-control(max-age)如果超期,说明失效 然后进行etag是否过期 ...

  9. Java-JDBCUtil工具类

    import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...

  10. es6的Set结构

    今天看了一下es6的文档,发现还是比较实用的,Set结构可以用来数组的去重哎 let arr = [1,3,6,3,1,9] let arr1 = new Set(arr) [...arr1]的值就是 ...