
Если в блоке try выбрасываются разные виды проверяемых исключений, а в блоке catch отлавливается только их базовый тип, то, начиная с Java 7, компилятор может определить какое именно исключение было поймано и перебросить именно его, а не общий тип.
class Test {
static void run(int a) throws SQLException, RemoteException {
try {
switch (a) {
case 10:
throw new NullPointerException();
case 0:
throw new SQLException();
default:
throw new RemoteException();
}
} catch (Exception e) {
throw e; // line 1
}
}
public static void main(String[] args) {
try {
run(-10); // class java.rmi.RemoteException
} catch (Exception e) {
System.out.println(e.getClass());
}
}
}
Если в предыдущем примере "line 1" заменить на "throw new Exception()", то пример не скомпилируется, т.к. в сигнатуре метода указаны подклассы Exception.