将异常重新分配给catch参数

时间:2015-12-24 19:49:58

标签: 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 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和命令行没有给出相同的结果。

有人可以告诉我这里我缺少的东西。
感谢。

1 个答案:

答案 0 :(得分:0)

好的,你所遇到的问题是由于你基本上说的原因引起的......你不能抛出你没有说明方法可以抛出的异常。

现在,您确实犯了IOException,但变量本身指向Exception类型的对象。 而不是那两行

(2c)

为什么不做呢

e = new IOException();
throw e;

它会为您提供您想要的结果,并且不会给您现在的错误。