我想知道为什么InvocationTargetException
被设计为将其原因存储为目标,要求每个人通过invocationTargetException.getTargetException()
而不是invocationTargetException.getCause()
打开它。这是通过记录不完整/错误的堆栈跟踪来解决错误的最常见情况之一。这似乎是java语言中糟糕的设计决策,或者这个设计的目的是什么?
答案 0 :(得分:1)
您似乎误以为getCause
没有返回与getTargetException
相同的值,因为它返回相同的值。只是getCause
在早期Java版本中不存在。自Java 1.1以来,InvocationTargetException
已经存在,而Java 1.4中只引入了一般的异常链接。
引用InvocationTargetException
(强调我的):
从版本1.4开始,此异常已经过改进,以符合通用异常链机制。在构造时提供并通过
getTargetException()
方法访问的“目标异常”现在称为原因,可以通过Throwable.getCause()
方法以及前面提到的方法访问“传统方法。“
和InvocationTargetException.getTargetException()
文档(强调我的):
获取抛出的目标异常。
此方法早于通用异常链设施。
Throwable.getCause()
方法现在是获取此信息的首选方法。
如果您查看getCause
和getTargetException
的实现,它们具有相同的实现:
/** * Get the thrown target exception. * * <p>This method predates the general-purpose exception chaining facility. * The {@link Throwable#getCause()} method is now the preferred means of * obtaining this information. * * @return the thrown target exception (cause of this exception). */ public Throwable getTargetException() { return target; } /** * Returns the cause of this exception (the thrown target exception, * which may be {@code null}). * * @return the cause of this exception. * @since 1.4 */ public Throwable getCause() { return target; }