让我们假设您有一些方法声明抛出未经检查的异常
编辑:让我们说你不是设计这种方法的人,而是一个非常可敬的框架的作者(Spring,aekhm!),你只是叫它
void someMethod() throws UncheckedException;
我的第一个问题是:
我们假设你有另一种方法可以调用someMethod
void someOtherMethod() {
someMethod()
}
我的第二个问题是:
UncheckedException
中投掷someOtherMethod
的最佳做法是什么?只是一点背景:
Spring框架的异常基于未经检查的异常。因此,例如,某些方法正在抛出(并在throws
中声明它)DataAccessException。如果我的代码正在使用这些调用,它是否应该声明抛出这些异常?为什么?
答案 0 :(得分:6)
无需在方法的throws ...
子句中声明未经检查的异常。如Java Language Specification中所述,“允许但不要求在throws子句中提及未经检查的异常类”。
如果您预计API的用户可能会遇到未经检查的异常,则通常会在Javadoc中列出未经检查的异常。一个常见的例子是列出可能抛出IllegalArgumentException
的原因。
如果将一个方法与另一个方法包装在一起,则应用 Effective Java 原则来抛出适合抽象级别的异常(第61项)。这应该适用于已检查的异常和预期的未经检查的异常。
答案 1 :(得分:3)
我建议阅读伟大的书" Effective Java"中的第9章。您将获得所有问题的答案,您将享受到精彩的阅读。
特别为您提问:
使用Javadoc @throws标记记录每个未经检查的异常 方法可以抛出,但不要使用throws关键字来包含 方法声明中未经检查的异常
答案 2 :(得分:2)
最佳做法是不要声明未经检查的例外。你没有看到这样的方法:
public void foo() throws NullPointerException {...}
你应该只对Checked Exceptions
使用投掷。通过说throws
你希望clinet以任何方式处理他的例外情况,而Unchecked Exceptions
不适用
编辑:
评论中有一些热烈的讨论,所以只是为了澄清:你不必声明Unchecked Exceptions
这并不意味着你不能,尽管在大多数情况下你不应该。我更喜欢在javadoc样式注释中而不是在throws
子句中提及它们。还有很多其他例子,你通常不应该做某些事情,但在某些情况下你可能需要这样做。在我看来,底线是:不,你不应该在投注Unchecked Exceptions
中列出clause
。
答案 3 :(得分:0)
在我看来,最好的做法是不要在方法的头部使用throws来进行未经检查的异常,但不要忘记记录方法引发的每个异常(已检查或未检查):
/**
* Some doc
* @throws IllegalArgumentException if ...
*/
public void m() {
//...
throw new IllegalArgumentException();
}
答案 4 :(得分:0)
记录您的API是一件好事,无论是声明抛出还是将@throws添加到您的javadoc都是一种很好的做法。它只会让读者更清楚,这绝不是坏事。我并不总是这样做,但一般来说,你希望人们意识到某些事情可能会失败。我不会为NPE这样做,但输入验证错误或授权错误之类的东西是你可能想要记录的东西。