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