Java 将异常重新分配给catch参数
考虑以下代码。Java 将异常重新分配给catch参数,java,eclipse,exception,java-7,Java,Eclipse,Exception,Java 7,考虑以下代码。 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 SQLExce
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),这就是为什么我们在第3行出现编译错误的原因
java6中也不允许这种重新分配。我认为应该允许它在java6中重新分配,所以我在eclipse中更改了java编译器的属性,并将compliance level设置为1.6,以查看此代码是否编译。
我无法预测的行为是:
1.Eclipse给出了相同的错误
未处理的异常类型异常
用于java 6 7和8。
2.当我使用javac-target 1.6-source 1.6 ReassignmentICatch.java尝试命令行时,我得到了
警告:[选项]引导类路径未与一起设置
-source 1.6 reassignicatch.java:18:错误:未报告的异常;必须注意或声明要抛出
throw e;
^ 1 error 1 warning
投掷e;
^1错误1警告
使用java7和java8,我能够成功地编译和运行它,并且输出没有抛出。
有人能告诉我这里缺少什么吗。
谢谢。好的,您遇到的问题是由于您所述的基本原因造成的。。。无法引发未声明该方法可以引发的异常
现在,您确实将e设置为IOException,但变量本身指向异常类型的对象。
而不是那两行
e = new IOException();
throw e;
为什么不直接做呢
throw new IOException();
它会给你想要的结果,不会给你现在得到的错误。好的,你的问题是由你所说的基本原因引起的。。。无法引发未声明该方法可以引发的异常
现在,您确实将e设置为IOException,但变量本身指向异常类型的对象。
而不是那两行
e = new IOException();
throw e;
为什么不直接做呢
throw new IOException();
它会给你想要的结果,不会给你现在得到的错误。在java7中,编译器将e视为最后一种变量(类似于java7引入的multicatch特性)这就是为什么重新分配并再次抛出e是错误的。我不明白的是为什么它不能用java6编译,因为方法couldThrowAnException和rethrow在声明中明确提到它可以抛出IOException。那么,重新分配并抛出一个已经处理过的异常有什么错呢。。还有为什么我在使用命令行编译它时会得到不同的行为?因为在代码的第1行中,e被声明为异常,而不是IOException或SQLException。确实,您在其中放入了IOException,但编译器无法预测它。在java7中,编译器将e视为最后一种变量(类似于java7引入的multicatch特性)这就是为什么重新分配并再次抛出e是错误的。我不明白的是为什么它不能用java6编译,因为方法couldThrowAnException和rethrow在声明中明确提到它可以抛出IOException。那么,重新分配并抛出一个已经处理过的异常有什么错呢。。还有为什么我在使用命令行编译它时会得到不同的行为?因为在代码的第1行中,e被声明为异常,而不是IOException或SQLException。确实,您在其中放入了IOException,但编译器无法预测它。