我刚刚意识到我可以编写一个方法多次声明相同的检查异常。
public void myMethod() throws MyException, MyException, MyException {
我想不出我为什么要这样做的原因。我一直在寻找一段时间,但我无法找到是否有资源可以解释为什么这是可以接受的,或者它怎么可能是好的。谁能指出我有关此的一些资源?
我刚刚意识到我可以编写一个方法多次声明相同的检查异常。
public void myMethod() throws MyException, MyException, MyException {
我想不出我为什么要这样做的原因。我一直在寻找一段时间,但我无法找到是否有资源可以解释为什么这是可以接受的,或者它怎么可能是好的。谁能指出我有关此的一些资源?
throws
JLS 中没有任何内容阻止您在子句中指定相同的异常类型(甚至子类型) 。根据JLS 第 8.4.6 节,唯一的限制是:
如果子句中提到的ExceptionType
throws
不是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 还是警告我列表中有“更普遍的例外”。
顺便说一句,是否检查了上面示例中的任何异常类型似乎并不重要。
正如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
声明引起的行为差异。