Preface
1. Throwable
- 所有Throwable的子类在构造器中都可以接收一个cause对象作为参数。这个cause就用来表示原始异常,这样可以把原始异常传递给新的异常,使得即使在当前位置创建并抛出了新的异常,你也能通过这个异常链追踪到异常最初发生的位置
- 可以接收Exception参数的构造方法
throw new BusinessRuntimeException(exception);
// 5 个构造方法
public Throwable() {
fillInStackTrace();
}
public Throwable(String message) {
fillInStackTrace();
detailMessage = message;
}
public String getMessage() {
return detailMessage; // 构造方法中给 message 赋值
}
// Subclasses may override this method in order to produce a locale-specific message
public String getLocalizedMessage() {
return getMessage();
}
public String toString() {
String s = getClass().getName();
String message = getLocalizedMessage();
return (message != null) ? (s + ": " + message) : s;
}
public StackTraceElement[] getStackTrace() {
return getOurStackTrace().clone();
}
// Throwable#printStackTrace(PrintStreamOrWriter)
// Throwable#getOurStackTrace
public final class StackTraceElement {
}
2. Java 虚拟机堆栈
- 栈是限制插入和删除只能在一个位置上进行的线性表
- 堆是一种特别的树状数据结构,是一棵完全二叉树;最大堆,最小堆
- JVM中的堆特指用于存放Java对象的内存区域,JVM堆被同一个JVM示例中的所有Java线程共享
- JVM栈可能会抛出的异常:StackOverflowError, OutofMemoryError
- JVM堆可能会抛出的异常:OutofMemoryError
- 经常说的"堆栈"指的是堆还是栈呢? 指Stack
2.1 异常跟踪栈
try {} catch(Exception e) {e.printStackTrace();}
- 异常栈组成:异常名字 + message + 路径(Tab制表符+ at 开头, first int first out)
- 异常信息(重复的堆栈信息)被省略,N more
Throwable#printEnclosedStackTrace
网友评论