Подпись метода, включая исключение throws? - PullRequest
0 голосов
/ 21 мая 2018

Я знаю, что сигнатура метода включает имя метода и его список параметров .

Но как насчет throws Exception?

public List<ServiceStatusVo> listServiceStatuses() throws RetrieverException {
    ...
    return list;
}

Если он не включен, то почему я не могу передать следующую лямбду:

() -> listServiceStatuses()

но я могу передать

() -> {
    try {
        return listServiceStatuses();
    } catch (RetrieverException e) {
    }
}

А также я могу выбросить это снова

() -> {
    try {
        return listServiceStatuses();
    } catch (RetrieverException e) {
        throw e;
    }
}

Я знаю Supplier<T>функциональный интерфейс, вот что меня действительно смущает , если throws не является частью сигнатуры метода .

Спасибо за помощь.

1 Ответ

0 голосов
/ 21 мая 2018

Речь идет не о подписи метода напрямую.Начиная с JLS Sec 11.2.3 :

Ошибка времени компиляции, если лямбда-тело может выдать некоторый класс исключений E, когда E является проверенным исключением class и E - это , а не подкласс некоторого класса, объявленного в предложении throws типа функции, на который нацелено лямбда-выражение.

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

Но помните, что «проверенное исключение» означает время компиляциипроверенное исключение : компилятор удостоверяется, что вы обработали все проверенные исключения;но после его компиляции проверенные и непроверенные типы исключений обрабатываются одинаково.Обратите внимание, что спецификация JVM даже не упоминает о проверяемости в разделе об исключениях.

Таким образом, как видно во время выполнения, метод может вызвать любое исключение.И как указано в спецификации языка:

Два метода или конструктора, M и N, имеют одинаковую сигнатуру, если имеют одинаковое имя, одинаковые параметры типа (если есть) (§8.4.4), и, после адаптации типов формальных параметров N к параметрам типов M, те же типы формальных параметров.

...