编译器是否考虑java中的错误处理中的实际类型

时间:2018-04-19 17:22:47

标签: java error-handling try-catch throwable

为什么这样做

class blah{
    public void someMethod(){
        try{
            throw new NullPointerException();
        }
        catch(Throwable t){
            System.out.println("Caught!");
            throw t;
        }
    }
}

似乎编译器有些如何看到t的实际类型

3 个答案:

答案 0 :(得分:0)

它有效,因为NullPointerExceptionThrowable的一个实例。 catch子句捕获声明类型的所有实例。

答案 1 :(得分:0)

该代码将无法在Java 7之前编译。

来自Java SE 7 Features and EnhancementsCatching Multiple Exception Types and Rethrowing Exceptions with Improved Type Checking部分:

  

通过更具包容性的类型检查重新排除异常

     

与早期版本的Java SE相比,Java SE 7编译器对重新抛出的异常执行更精确的分析。这使您可以在方法声明的throws子句中指定更具体的异常类型。

     

考虑以下示例:

static class FirstException extends Exception { }
static class SecondException extends Exception { }

public void rethrowException(String exceptionName) throws Exception {
  try {
    if (exceptionName.equals("First")) {
      throw new FirstException();
    } else {
      throw new SecondException();
    }
  } catch (Exception e) {
    throw e;
  }
}
     

此示例try阻止可能会引发FirstExceptionSecondException。假设您要在throws方法声明的rethrowException子句中指定这些异常类型。在Java SE 7之前的版本中,您不能这样做。由于catch子句e的异常参数是类型Exception,并且catch块重新抛出异常参数e,因此您只能指定异常类型{{ 1 {}在Exception方法声明的throws子句中。

     

但是,在Java SE 7中,您可以在rethrowException方法声明的FirstException子句中指定异常类型SecondExceptionthrows。 Java SE 7编译器可以确定语句rethrowException抛出的异常必须来自throw e块,并且try块抛出的唯一异常可以是{{1} }和try。即使FirstException子句SecondException的异常参数是类型catch,编译器也可以确定它是eException的实例:

FirstException

答案 2 :(得分:-1)

NullPointerException是Excepsion的子级。例外是Throwable的孩子。所以那应该是多态性的。