多次声明相同的已检查异常

时间:2015-02-03 20:28:16

标签: java exception checked-exceptions

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

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

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

2 个答案:

答案 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声明引起的行为差异。