Перебрасывание исключений с более общим типом

Перебрасывание исключений с более общим типом

Если в блоке 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.
Исключения