我刚刚意识到我可以写一个方法多次声明相同的检查异常。
public void myMethod() throws MyException, MyException, MyException {
我想不出我想要这样做的原因。我一直在寻找一段时间,但我无法找到是否有资源可以解释为什么这是可以接受的,或者它怎么可能是好的。任何人都能指出我的一些资源吗?
答案 0 :(得分:4)
JLS中没有任何内容阻止您在throws
子句中指定相同的异常类型(甚至是子类型)。根据{{3}},唯一的限制是:
如果
throws
子句中提到的 ExceptionType 不是Throwable
的子类型(第4.10节),则是编译时错误。
所以,编译:
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也警告我列表中的“更常见的例外”。
顺便说一下,检查上述示例中是否有任何异常类型似乎并不重要。
答案 1 :(得分:1)
如rgettman's answer中所述,重复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
声明引起的行为差异。