Компилятор не может знать, что Assert.fail
всегда будет генерировать исключение, если только он не углубится в байт-код этого метода и не проведет над ним своего рода статический анализ (и как только вы запустите такого рода вещь, то где вы останавливаетесь?). В спецификации языка Java указано (раздел 8.4.7а>)
Если объявлен метод с возвращаемым типом, то возникает ошибка времени компиляции, если тело метода может завершиться нормально (§14.1).
где "может завершиться нормально" в вашем примере сводится к (раздел 14.21)
Непустой блок, не являющийся блоком-переключателем, может завершиться нормально, если последний оператор в нем может завершиться нормально.
Последний оператор в вашем методе — это оператор switch
:
Оператор switch может завершиться нормально, если верно хотя бы одно из следующего:
[...]
- Последний оператор в блоке switch может завершиться нормально.
Последний оператор в switch
— это оператор-выражение (вызов метода).
Оператор выражения может завершиться нормально, если он достижим.
т. е. в спецификации конкретно указано, что компилятор не должен заглядывать внутрь каких-либо вызовов методов, и любое выражение вызова метода должно рассматриваться как выражение, которое может завершиться нормально.
В этом же разделе также определяется, что
Оператор break
, continue
, return
или throw
не может нормально завершиться.
Поэтому, чтобы компилятор был доволен, вам нужно добавить return или throw в конец метода.
// will never be reached
throw new Error();
Я бы лично пошел на бросок с комментарием, объясняющим, что что-то пошло не так, если эта линия когда-либо будет достигнута...
person
Ian Roberts
schedule
25.04.2014