【发布时间】:2015-12-24 19:49:57
【问题描述】:
考虑以下代码。
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.SQLException;
import javax.security.auth.login.FailedLoginException;
public class ReassignmentICatch {
public void couldThrowAnException() throws SQLException, IOException {}
public void rethrow() throws SQLException, IOException {
try {
couldThrowAnException();
System.out.println("Did not throw");
} catch (Exception e) { //Line-1
e = new IOException(); //Line-2
throw e; //Line-3
}
}
public static void main(String[] args) {
ReassignmentICatch rc = new ReassignmentICatch();
try {
rc.rethrow();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
据我所知,java7 中的 catch(Exception e) 不会像 java6 那样捕获所有异常,而是仅捕获在方法 couldThrowAnException 的声明中提到的那些异常。此外,不允许将新异常重新分配给 catch 参数 (e),这就是我们在 Line-3 处收到编译错误的原因
java6中也不允许这种重新分配吗?我认为应该允许在 java6 中重新分配,所以我在 eclipse 中更改了 java-compiler 的属性并将合规级别设置为 1.6 以查看此代码是否编译。
我无法预测的行为是:
1.Eclipse 报同样的错误
未处理的异常类型Exception
适用于 java 6 7 和 8。
2.当我尝试使用javac -target 1.6 -source 1.6 ReassignmentICatch.java 的命令行时,我得到了
警告:[options] 引导类路径未与 -source 1.6 ReassignmentICatch.java:18:错误:未报告的异常异常;必须被抓住或宣布被扔掉
抛出 e; ^ 1 个错误 1 个警告
并且使用 java7 和 java8 我能够编译并成功运行它并输出 Did not throw 。为什么 IDE 和命令行没有给出相同的结果。
有人可以建议我在这里缺少什么。
谢谢。
【问题讨论】:
标签: java eclipse exception java-7