类 Throwable

将此 throwable 及其回溯打印到标准错误流。此方法在错误输出流上打印此 Throwable 对象的堆栈跟踪,即字段 System.err 的值。输出的第一行包含此对象的 toString() 方法的结果。剩余的行表示先前由方法 fillInStackTrace() 记录的数据。此信息的格式取决于实现,但以下示例可能被视为典型示例:
java.lang.NullPointerException
at MyClass.mash(MyClass.java:9)
at MyClass.crunch(MyClass.java:6)
at MyClass.main(MyClass.java:3)
此示例是通过运行以下程序生成的:
class MyClass {
public static void main(String[] args) {
crunch(null);
}
static void crunch(int[] a) {
mash(a);
}
static void mash(int[] b) {
System.out.println(b[0]);
}
}
具有已初始化的非空原因的可抛出对象的回溯通常应包括该原因的回溯。此信息的格式取决于实现,但以下示例可被视为典型:
HighLevelException: MidLevelException: LowLevelException
at Junk.a(Junk.java:13)
at Junk.main(Junk.java:4)
Caused by: MidLevelException: LowLevelException
at Junk.c(Junk.java:23)
at Junk.b(Junk.java:17)
at Junk.a(Junk.java:11)
... 1 more
Caused by: LowLevelException
at Junk.e(Junk.java:30)
at Junk.d(Junk.java:27)
at Junk.c(Junk.java:21)
... 3 more
请注意包含字符 "..." 的行的存在。这些行指示此异常的堆栈跟踪的其余部分与由此异常(“封闭”异常)引起的异常的堆栈跟踪底部的指示帧数相匹配。在常见情况下,这种简写可以大大减少输出的长度,在这种情况下,从与捕获“原因异常”相同的方法引发包装异常。上述示例是通过运行以下程序生成的:
public class Junk {
public static void main(String args[]) {
try {
a();
} catch(HighLevelException e) {
e.printStackTrace();
}
}
static void a() throws HighLevelException {
try {
b();
} catch(MidLevelException e) {
throw new HighLevelException(e);
}
}
static void b() throws MidLevelException {
c();
}
static void c() throws MidLevelException {
try {
d();
} catch(LowLevelException e) {
throw new MidLevelException(e);
}
}
static void d() throws LowLevelException {
e();
}
static void e() throws LowLevelException {
throw new LowLevelException();
}
}
class HighLevelException extends Exception {
HighLevelException(Throwable cause) { super(cause); }
}
class MidLevelException extends Exception {
MidLevelException(Throwable cause) { super(cause); }
}
class LowLevelException extends Exception {
}
从版本 7 开始,该平台支持以下概念被抑制的异常(与 try -with-resources 语句结合使用)。为了传递异常而被抑制的任何异常都会在堆栈跟踪下方打印出来。此信息的格式取决于实现,但以下示例可被视为典型示例:
Exception in thread "main" java.lang.Exception: Something happened
at Foo.bar(Foo.java:10)
at Foo.main(Foo.java:5)
Suppressed: Resource$CloseFailException: Resource ID = 0
at Resource.close(Resource.java:26)
at Foo.bar(Foo.java:9)
... 1 more
请注意,“... n more”符号用于抑制的异常,就像用于原因一样。与原因不同,受抑制的异常缩进超出其“包含异常”。
异常可以同时具有原因和一个或多个被抑制的异常:
Exception in thread "main" java.lang.Exception: Main block
at Foo3.main(Foo3.java:7)
Suppressed: Resource$CloseFailException: Resource ID = 2
at Resource.close(Resource.java:26)
at Foo3.main(Foo3.java:5)
Suppressed: Resource$CloseFailException: Resource ID = 1
at Resource.close(Resource.java:26)
at Foo3.main(Foo3.java:5)
Caused by: java.lang.Exception: I did it
at Foo3.main(Foo3.java:8)
同样,被抑制的异常可能有一个原因:
Exception in thread "main" java.lang.Exception: Main block
at Foo4.main(Foo4.java:6)
Suppressed: Resource2$CloseFailException: Resource ID = 1
at Resource2.close(Resource2.java:20)
at Foo4.main(Foo4.java:5)
Caused by: java.lang.Exception: Rats, you caught me
at Resource2$CloseFailException.
... 2 more