我继承了Exception类来创建自己的异常。类似下面的代码
public class ApplicationException extends Exception {
ApplicationException(String errorMessage) {
super(errorMessage);
}
}
问题是堆栈跟踪始终为空。以下代码不会向控制台写任何内容。
ApplicationException(String errorMessage) {
super(errorMessage);
System.out.println(this.getStackTrace());
}
我不明白为什么它是空的,因为Throwable(String)
正在调用fillInStackTrace method
。有没有办法填写Stack,还是我应该做的其他事情?
答案 0 :(得分:6)
堆栈跟踪不为空。只是它是一个数组,并且数组的默认toString()
不会显示其元素,只显示其类名和hashCode(例如[Ljava.lang.StackTraceElement;@b0cf5f
) 。拨打:
this.printStackTrace();
或循环遍历数组并手动显示其内容,您将看到堆栈跟踪。
答案 1 :(得分:4)
this.getStackTrace()
返回StackTraceElement[]
。数组never override toString
,所以打印它只会产生类似的结果:
[Ljava.lang.StackTraceElement;@1a23b006
您可能想要调用printStackTrace()
。如果你不关心它的原因(在你的情况下,它不会有任何原因),你可以迭代数组中的StackTraceElement
个对象并打印出每个对象。
事实上,如果您想要的 all 是堆栈跟踪,那么您可以完全没有例外:Thread.currentThread().getStackTrace()
使您获得相同的StackTraceElement[]
。
答案 2 :(得分:0)
在您创建新例外时,您还没有抛出它,因此它不会有堆栈跟踪。
编辑:
扩展此。 throwable中的fillInStackTrace将预期的堆栈跟踪设置为堆栈跟踪元素的空数组。 getStackTrace返回此堆栈跟踪。 printStackTrace发现stacktrace设置为默认的空数组,它打印调用它的当前堆栈跟踪,否则它会打印异常中包含的堆栈跟踪。