我有两段代码:
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;
}
}
}
and :
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();
}
}
}
在第二种情况下,当我在 catch 子句中抛出 new Exception () 时,出现编译错误“未处理的异常类型异常”。你能解释一下为什么在第一种情况下一切正常,但在第二种情况下我得到编译错误?在这两种情况下,我都会抛出异常,但在第二种情况下,我会创建新的异常实例(这只是这两个示例之间的区别)。感谢帮助。
首先:你的第一个例子也不能用 Java 6 编译. It will但是,由于异常处理方面的新功能,请使用 Java 7 进行编译。
See 这个链接了解更多信息。基本上,从 Java 7 开始,编译器可以分析从try
更精确地阻止;即使您捕获一个或多个抛出异常的超类并“按原样”重新抛出它(即,不进行强制转换),编译器也不会抱怨。然而,Java 6 及更早版本will抱怨。
然而,在你的第二个例子中,你重新抛出了new的实例Exception
。事实上,这与签名不匹配。
总而言之,这意味着使用 Java 7 可以做到这一点,但使用 Java 6 则不行:
public void someMethod()
throws MyException
{
try {
throw new MyException();
} catch (Exception e) { // Note: Exception, not MyException
throw e;
}
}
Java 6 只看到catch参数是类型Exception
;对于 Java 6,这与方法签名不匹配 --> 编译错误。
Java 7看到try块只能抛出MyException
。因此,方法签名匹配 --> 没有编译错误。
但不要这样做;)这相当令人困惑......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)