0

在Java中,如果捕获并重新抛出一般异常,外部方法仍然能够捕获特定异常吗?

换句话说,我可以这样做:


try {
    try {
         //...
    } catch (Exception e) {
         //...
        throw e;
    }
} catch (SpecificException e) {
     //...
}
4

3 回答 3

2

重新抛出异常不会改变它的任何内容(它仍然是最初抛出的同一个对象)。

于 2012-01-07T03:54:21.010 回答
2

虽然 jtahlborn 的答案是正确的,但还有一个优点:编译器会看到您正在抛出泛型类型的异常(即使在运行时它只能是特定类的异常),并将强制您在方法头。

private void test() throws FileNotFoundException {
    try {
        throw new FileNotFoundException("Es una exception");
    } catch (IOException e) {
        throw e; <-- Error because the method only throws
                       FileNotFoundException, not IOException
    }
}

e确实是 FileNotFoundException,但由于它被声明为 IOException,编译器可以使用更广泛的类。您可以做的是“投射”异常。

        throw (FileNotFoundException) e;
于 2012-01-07T04:01:59.940 回答
0

Eclipse 将内部捕获中的“throw e”标记为未处理的异常,但它确实捕获了异常,因为当我运行它时,它会打印“它工作!”。谢谢@jtahlborn。不幸的是,这意味着在某个地方仍然需要一个不必要的 try/catch 块。


public class Tester {

    public static void main(String[] args) {
        try {
            try {
                throw new SpecificException("Test!");
            } catch (Exception e) {
                throw e;
            }
        } catch (SpecificException e) {
            System.out.println("It worked!");
        }
    }

}
于 2012-01-07T03:56:55.770 回答