Зачем мне возвращать значение в методе Java, даже если я всегда выбрасываю исключение? - PullRequest
1 голос
/ 16 марта 2012

Почему не компилируется следующий код:

    @Test
public boolean testException() throws MyException {
    try {
        System.out.println("Try some resource, which may throw an exception");
        return resource.getSomething();
    } catch (Exception e) {
        logAndThrowSpecificException(e);
    } finally {
        System.out.println("Clean up");
    }
}

private void logAndThrowSpecificException(Exception e) throws MyException {
    throw new MyException("Checked exception", e);
}

В IntelliJ жалуется, что мне нужно вернуть значение из последней строки метода testException (), но, насколько я вижу, нет пути к коду, который дойдет до этой точки? Что мне не хватает?

Есть еще похожих вопросов по StackOverflow , но лучшее решение, которое я смог найти, это просто вставить выражение возврата null. Не было правильного ответа на вопрос, почему это было необходимо.

Ответы [ 3 ]

6 голосов
/ 16 марта 2012

Я подозреваю, что он не знает наверняка, что logAndThrowSpecificException() всегда будет выдавать исключение, даже если у него очень четкое имя относительно его цели, поэтому было бы возможно достичь конца testException().

2 голосов
/ 16 марта 2012

[...] насколько я вижу, нет пути к коду, который дойдет до этой точки?Чего мне не хватает?

Как правило, невозможно определить, возможен ли определенный путь или нет (стандартный результат немедленно следует из проблемы остановки).

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

Особенности того, что считается достижимым кодом, указаны в Спецификации языка Java Раздел 14.21 Недоступные заявления .Фактически, было бы прямым нарушением спецификации , если компилятор скомпилировал предоставленный вами код.

1 голос
/ 16 марта 2012

Даже если кажется очевидным, что logAndTrowSpecificException всегда вызывает исключение, компилятор не может знать это наверняка. Можно инструктировать класс во время загрузки и заменить реализацию метода той, которая не (всегда) выдает исключение.

Ключевое слово: аспектно-ориентированное программирование.

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