使用Java SE 6(和以前的版本)更精确地重新抛出异常

时间:2017-10-28 14:36:00

标签: java exception

鉴于以下计划:

class FirstException extends Exception {}

class SecondException extends Exception {}

class RethrowException {
     public void rethrowMethod() throws FirstException, SecondException {
          boolean flag = true;
          try {
              if(flag)
                  throw new FirstException();
              else
                  throw new SecondException(); 
          }
          catch(Exception ex) {
              throw ex;   // does not compile "Unhandled exception type Exception" 
          }
     }
}

这个错误恰好发生在Java SE 6(或之前的版本)上,因为首先,当我们构建" catch" block(catch(Exception ex)),ex指定的异常对象的类型为FirstException(或SecondException)。但是,当重新抛出exthrow ex)时,Java编译器执行如下3个任务:

  1. 发布" ex"到系统。
  2. 初始化新的异常对象," ex"具有异常类型
  3. 扔"前" - 这是Exception的实例,现在不是FirstException(或SecondException)的实例
  4. 因此,在Java SE 6中,我们不能使用"更准确地说是重新抛出异常"因为以下原因。但是,在Java SE 7(或更高版本)中,我们可以这样做,因为当我们重新抛出ex时,运行时系统不会释放和初始化新对象ex。它将检查(查找)ex1 come from (the try block above), and so know that ex is an instance of FirstException or SecondException`。

    我上面的解释是否正确?

1 个答案:

答案 0 :(得分:2)

在Java上的任何版本中,通过捕获异常并从catch块中抛出异常,不会创建新的异常实例。

在Java 6-中,被捕获的异常的类型Exception块声明为catch,因此这就是编译器认为被抛出的内容。 / p>

在更高版本中,异常的类型被推断为仅限于可以try块中抛出的内容。