为什么这样做
class blah{
public void someMethod(){
try{
throw new NullPointerException();
}
catch(Throwable t){
System.out.println("Caught!");
throw t;
}
}
}
似乎编译器有些如何看到t的实际类型
答案 0 :(得分:0)
它有效,因为NullPointerException
是Throwable
的一个实例。 catch子句捕获声明类型的所有实例。
答案 1 :(得分:0)
该代码将无法在Java 7之前编译。
来自Java SE 7 Features and Enhancements,Catching 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
阻止可能会引发FirstException
或SecondException
。假设您要在throws
方法声明的rethrowException
子句中指定这些异常类型。在Java SE 7之前的版本中,您不能这样做。由于catch
子句e
的异常参数是类型Exception
,并且catch块重新抛出异常参数e
,因此您只能指定异常类型{{ 1 {}在Exception
方法声明的throws
子句中。但是,在Java SE 7中,您可以在
rethrowException
方法声明的FirstException
子句中指定异常类型SecondException
和throws
。 Java SE 7编译器可以确定语句rethrowException
抛出的异常必须来自throw e
块,并且try
块抛出的唯一异常可以是{{1} }和try
。即使FirstException
子句SecondException
的异常参数是类型catch
,编译器也可以确定它是e
或Exception
的实例:FirstException
答案 2 :(得分:-1)
NullPointerException是Excepsion的子级。例外是Throwable的孩子。所以那应该是多态性的。