为什么InvocationTargetException旨在将其原因存储为目标?

时间:2016-09-11 17:15:52

标签: java error-handling

我想知道为什么InvocationTargetException被设计为将其原因存储为目标,要求每个人通过invocationTargetException.getTargetException()而不是invocationTargetException.getCause()打开它。这是通过记录不完整/错误的堆栈跟踪来解决错误的最常见情况之一。这似乎是java语言中糟糕的设计决策,或者这个设计的目的是什么?

1 个答案:

答案 0 :(得分:1)

您似乎误以为getCause没有返回与getTargetException相同的值,因为它返回相同的值。只是getCause在早期Java版本中不存在。自Java 1.1以来,InvocationTargetException已经存在,而Java 1.4中只引入了一般的异常链接。

引用InvocationTargetException(强调我的):

  

从版本1.4开始,此异常已经过改进,以符合通用异常链机制。在构造时提供并通过getTargetException()方法访问的“目标异常”现在称为原因,可以通过Throwable.getCause()方法以及前面提到的方法访问“传统方法。“

InvocationTargetException.getTargetException()文档(强调我的):

  

获取抛出的目标异常。

     

此方法早于通用异常链设施。 Throwable.getCause()方法现在是获取此信息的首选方法。

如果您查看getCausegetTargetException的实现,它们具有相同的实现:

/**
 * 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;
}