Бросьте Sub-Exception, поймайте как Super Exception и повторно выбросьте его, но объявите throws Sub-Exception - PullRequest
0 голосов
/ 21 января 2019

Java-документы четко объясняют согласованность объектов при работе с приведением типов, возвращаемым типом метода Over-riding, а также с выдачей и перехватом исключений. Но теперь меня немного смущают исключения, что скрывается за этим кодом ..

void getNames() throws SQLClientInfoException { /*throws Subclass object to caller*/
    try{
        // throwing Subclass object to catch block but up-casting to Exception
        throw new SQLClientInfoException(); 
    } catch (Exception e) {
        throw e; /* re-throwing throwing as Exception 
    }
}

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Это особенность языка программирования, представленная в 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: Повторное исключение с более инклюзивной проверкой типов .

0 голосов
/ 21 января 2019

Поскольку SQLClientInfoException является подклассом «java.lang.Exception», оно перехватывается блоком catch, когда выбрасывается SQLClientInfoException

«e» в блоке catch ссылается на SQLClientInfoException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...