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,但编译器无法预测它。