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".你能解释一下我为什么在第一种情况下一切都好,但在第二种情况下我得到编译错误?在这两种情况下我都抛出异常,但在第二种情况下,我创建了异常的新实例(这只是两个例子中的区别).感谢帮助.
首先:您的第一个示例也不使用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
.因此方法签名匹配 - >没有编译错误.
但是不要这样做;)这很令人困惑......
在第一个代码片段中,您将重新抛出NumberFormatException
可能出现的内容。在第二个代码片段中,您只抛出 generic Exception
,而不是NumberFormatException
方法所声明的 。
归档时间: |
|
查看次数: |
6572 次 |
最近记录: |