Выбрасывание исключений из двух интерфейсов [duplicate]

Я отвечу ужасным, нарисованным рукой комиком. Второе изображение является причиной того, что result является undefined в вашем примере кода.

4
задан Leo 10 October 2014 в 14:38
поделиться

5 ответов

Это конкретное предложение книги кажется неправильным.

Когда задействованы интерфейсы, более чем одно объявление метода может быть переопределено. с помощью одной переопределяющей декларации. В этом случае объявление переопределения должно иметь предложение throws, которое совместимо со всеми переопределенными объявлениями (§9.4.1) .

Таким образом, в этом случае, совместимым с обеими декларациями, было бы

@Override
public void x() {
}

. В обеих декларациях были общие исключения, которые они могли включить в декларацию.

interface I1 {
    public void x() throws I1Exception, I2Exception;
}

interface I2 {
    public void x() throws I2Exception;
}

then

@Override
public void x() throws I2Exception {
}

Или, альтернативно, в вашем примере, если у вас есть что-то вроде

class I1Exception extends I2Exception {
}

class I2Exception extends Exception {
}

Тогда можно было бы написать декларацию совместимого метода как

@Override
public void x() throws I1Exception {

}
3
ответ дан Nandana 28 August 2018 в 06:02
поделиться

Ошибка имеет два метода в одном классе с тем же именем, которые не имеют параметров. В java у вас могут быть разные методы с тем же именем, только если они получают разные параметры: например

public int i (int a);
public int i ();
0
ответ дан lateralus 28 August 2018 в 06:02
поделиться

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

Таким образом, метод должен бросить (грубо говоря) пересечение наборов исключений обоих методов. Если эти множества не пересекаются, то метод ничего не может выбросить. Итак, это:

@Override
public void x() {
}

ОК для обоих интерфейсов.

(Это немного сложнее из-за наследования, но вы получаете идею.)

Итак, с моей точки зрения

", если метод объявлен в 2 или более интерфейсах, и если этот метод объявляет, что он бросает разные исключения в предложении throws, реализация должна перечислять все эти исключения" (стр. 347)

не может быть правильным, потому что это не работает на практике. Вы (в большинстве случаев) не можете перечислить все эти исключения в реализации. Существуют исключения, такие как непроверенные исключения или идентичные / совместимые наборы исключений.

Однако я не мог найти нормативную ссылку в JLS для этого.

4
ответ дан lexicore 28 August 2018 в 06:02
поделиться

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

the implementation should list all these exceptions, вероятно, означает все исключения, которые один метод объявляет в предложении throws.

1
ответ дан Predrag Maric 28 August 2018 в 06:02
поделиться

Множество проверенных исключений, которые может быть выбрано методом метода, - это пересечение наборов проверенных исключений, которые, как объявлено, будут выбраны всеми применимыми типами, а не объединением. В результате объект x () на объекте вообще не может выбрасывать любые проверенные исключения и разрешен.

@Override
public void x() {
}

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

0
ответ дан Prototype Chain 28 August 2018 в 06:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: