请考虑以下代码。
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正在给出同样的错误
未处理的异常类型异常
for java 6 7 and 8.
2.当我尝试使用javac -target 1.6 -source 1.6 ReassignmentICatch.java
获取
警告:[options] bootstrap类路径未设置 -source 1.6 ReassignmentICatch.java:18:错误:未报告的异常异常;必须严格或声称被抛出
throw e; ^ 1 error 1 warning
使用java7和java8,我能够使用输出Did not throw
成功编译并运行它。为什么IDE和命令行没有给出相同的结果。
有人可以告诉我这里我缺少的东西。
感谢。
答案 0 :(得分:0)
好的,你所遇到的问题是由于你基本上说的原因引起的......你不能抛出你没有说明方法可以抛出的异常。
现在,您确实犯了IOException,但变量本身指向Exception类型的对象。 而不是那两行
(2c)
为什么不做呢
e = new IOException();
throw e;
它会为您提供您想要的结果,并且不会给您现在的错误。