在catch子句中抛出异常

use*_*733 6 java exception-handling

我有两段代码:

class PreciseRethrow {
public static void main(String[] str) {
    try {
        foo();
    } catch (NumberFormatException ife) {
        System.out.println(ife);
    }
}

static private void foo() throws NumberFormatException {
    try {
        int i = Integer.parseInt("ten");
    } catch (Exception e) {
        throw e;
    }
}
}
Run Code Online (Sandbox Code Playgroud)

并且:

class PreciseRethrow {
public static void main(String[] str) {
    try {
        foo();
    } catch (NumberFormatException ife) {
        System.out.println(ife);
    }
}

static private void foo() throws NumberFormatException {
    try {
        int i = Integer.parseInt("ten");
    } catch (Exception e) {
        throw new Exception();
    }
}
}
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,当我在catch子句中抛出新的Exception()时,我得到编译错误"Unhandled exception type Exception".你能解释一下我为什么在第一种情况下一切都好,但在第二种情况下我得到编译错误?在这两种情况下我都抛出异常,但在第二种情况下,我创建了异常的新实例(这只是两个例子中的区别).感谢帮助.

fge*_*fge 6

首先:您的第一个示例也不使用Java 6进行编译.这然而,随着Java 7的编译由于异常处理的新功能.

有关更多信息,请参阅此链接.基本上,从Java 7开始,编译器可以try更精确地分析从块中抛出的异常; 即使你捕获一个或多个抛出异常的超类并按"原样"重新抛出它(即没有强制转换),编译器也不会抱怨.然而,Java 6及更早版本抱怨.

在你的第二个例子中,你重新抛出一个新的实例Exception.事实上,这与签名不符.

总而言之,这意味着使用Java 7,您可以做到这一点,但不能使用Java 6:

public void someMethod()
    throws MyException
{
    try {
        throw new MyException();
    } catch (Exception e) { // Note: Exception, not MyException
        throw e;
    }
}
Run Code Online (Sandbox Code Playgroud)

Java 6只看到catch参数的类型Exception; 对于Java 6,这与方法签名 - >编译错误不匹配.

Java 7看到try块只能抛出MyException.因此方法签名匹配 - >没有编译错误.

但是不要这样做;)这很令人困惑......


Zav*_*ior 0

在第一个代码片段中,您将重新抛出NumberFormatException可能出现的内容。在第二个代码片段中,您只抛出 generic Exception,而不是NumberFormatException方法所声明的 。