将此 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]);
}
}
对于带初始化非空 cause 的 throwable 的追踪,通常应该包括 cause 的追踪。此信息的格式取决于实现,但以下示例是最常见的:
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
注意,存在包含字符 "..." 的行。这些行指示此异常的椎栈跟踪的其余部分匹配来自异常(由 "enclosing" 异常引起)的堆栈跟踪底部的指定数量的帧。这种简便方法可以大大缩短通常情况下的输出长度,这里抛出了包装的异常,其方法与捕获“作为 cause 的异常”的方法相同。上述示例通过运行以下程序生成:
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 {
}