为什么我在创建自己的异常时会得到一个空的堆栈跟踪?

时间:2014-05-23 15:41:22

标签: java exception stack-trace

我继承了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,还是我应该做的其他事情?

3 个答案:

答案 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设置为默认的空数组,它打印调用它的当前堆栈跟踪,否则它会打印异常中包含的堆栈跟踪。

相关问题