Это особенность языка программирования, представленная в Java SE 7 - Использование более точного пересчета в исключениях.
Компилятор Java SE 7 выполняет более точный анализ переброшенных исключений, чем более ранние выпуски Java. Это позволяет указать более конкретные типы исключений в предложении throws объявления метода.
До Java 7:
void aMethod() throws CustomDbException {
try {
// code that throws SQLException
}
catch(SQLException ex) {
throw new CustomDbException();
}
}
- Повторное создание исключения в блоке catch не обязательно указывает на
фактические исключения возможны из блока try.
- Тип создаваемого исключения не может быть изменен без изменения
подпись метода.
В Java 7 или выше:
void aMethod() throws IOException {
try {
Files.copy(srcePath, trgtPath); // throws IOException
}
catch(Exception ex) {
throw ex;
}
}
Приведенный выше код допустим в Java 7.
- Если исключение некоторого типа выдается в предложении try и ему не назначена переменная исключения в предложении catch, компилятор скопирует проверенный тип исключения, который может быть сгенерирован из блока try. (Это как если бы выкидывались все возможные исключения из блока try при условии, что переменная исключения не переназначена).
- Компилятор знает, что единственным возможным типом исключения является
IOException
(потому что это то, что Files.copy()
может выдать).
Также см. Эту статью на веб-сайте Oracle: Повторное исключение с более инклюзивной проверкой типов .