Нет. Это очень легко проверить.
public class Catch {
public static void main(String[] args) {
try {
throw new java.io.IOException();
} catch (java.io.IOException exc) {
System.err.println("In catch IOException: "+exc.getClass());
throw new RuntimeException();
} catch (Exception exc) {
System.err.println("In catch Exception: "+exc.getClass());
} finally {
System.err.println("In finally");
}
}
}
Следует напечатать:
In catch IOException: class java.io.IOException
In finally
Exception in thread "main" java.lang.RuntimeException
at Catch.main(Catch.java:8)
Технически это может быть ошибка компилятора, зависящее от реализации, неуказанное поведение или что-то в этом роде. Тем не менее, JLS довольно неплохо работает, и компиляторы достаточно хороши для такого рода простых вещей (случай с обобщенным углом может отличаться).
Также обратите внимание, что если вы поменяете местами два блока catch, он не скомпилируется. Второй улов будет полностью недоступен.
Обратите внимание, что блок finally всегда выполняется, даже если выполняется блок catch (кроме глупых случаев, таких как бесконечные циклы, присоединение через интерфейс инструментов и уничтожение потока, перезапись байт-кода и т. Д.).