3

我刚刚意识到我可以编写一个方法多次声明相同的检查异常。

public void myMethod() throws MyException, MyException, MyException {

我想不出我为什么要这样做的原因。我一直在寻找一段时间,但我无法找到是否有资源可以解释为什么这是可以接受的,或者它怎么可能是好的。谁能指出我有关此的一些资源?

4

2 回答 2

4

throwsJLS 中没有任何内容阻止您在子句中指定相同的异常类型(甚至子类型) 。根据JLS 第 8.4.6 节,唯一的限制是:

如果子句中提到的ExceptionTypethrows不是Throwable.

所以,这编译:

throws RedundantException, RedundantException, RedundantException

我的 IDE 警告我“重复抛出”,但这不是编译器错误。

我认为没有充分的理由这样做。我从来没有想过要尝试这个。

这编译,即使MySubclassException子类MyException

throws MyException, MySubclassException, MyException, MySubclassException

我能想到在throws子句中列出子类异常类型的唯一原因是在您自己的 Javadocs 中记录子类可能会被抛出,因此可以单独处理。

@throws MyException If something general went wrong.
@throws MySubclassException If something specific went wrong.

即便如此,我的 IDE 还是警告我列表中有“更普遍的例外”。

顺便说一句,是否检查了上面示例中的任何异常类型似乎并不重要。

于 2015-02-03T21:35:29.100 回答
1

正如rgettman 的回答throws中提到的,重复声明没有语义意义。但是,javac仍然将它们记录在编译的类文件中,使它们可用于反射,如下例所示:

public class Main {
    public static void main(String[] args) throws IOException, IOException,
            IOException, NoSuchMethodException {
        Arrays.stream(Main.class.getMethod("main", String[].class).getExceptionTypes())
                .forEachOrdered(System.out::println);
    }
}

哪个打印

class java.io.IOException
class java.io.IOException
class java.io.IOException
class java.lang.NoSuchMethodException

这没有用(并且可能暴露了有问题的消费者Method.getExceptionTypes()),但这是由重复throws声明引起的行为差异。

于 2015-02-03T21:47:21.823 回答