【问题标题】:Reassigning an Exception to the catch parameter将异常重新分配给 catch 参数
【发布时间】: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


    【解决方案1】:

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

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

    e = new IOException();
    throw e;
    

    为什么不干呢

    throw new IOException();
    

    它会给你你想要的结果,不会给你现在得到的错误。

    【讨论】:

    • 在 java7 中,编译器将 e 视为最后一种变量(类似于 java7 引入的 multicatch 特性),这就是为什么重新分配并再次抛出 e 是错误的......我没有得到的是为什么它不能在 java6 中编译,因为方法 canThrowAnException 和 rethrow 在其声明中明确提到它可以抛出 IOException。那么重新分配和抛出已经处理的异常有什么问题..还有为什么当我使用命令行编译它时会出现不同的行为?
    • 因为代码 e 的第 1 行被声明为异常,而不是 IOException 或 SQLException。确实是你在里面放了一个IOException,但是编译器没办法预测到。
    猜你喜欢
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    相关资源
    最近更新 更多