В сигнатуре метода Java нет способа сообщить компилятору о невозможности возврата метода. Без этого у компилятора нет другого выбора, кроме как предположить, что он может вернуться. (Действительно, правила JLS о достижимости / определенном назначении прямо заявят об этом ... если вы захотите пройтись по ним.)
Я колеблюсь между двумя подходами:
int fun() {
...
error();
return 0; // NOT REACHED
}
и
int fun() {
...
error();
throw new AssertionError("not reached");
}
Ни то, ни другое не вполне удовлетворительно.
В первой версии комментарий важен, так как кто-то, читающий ваш код в первый раз, может не осознавать, что error
никогда не вернется.
Вторая версия является более надежной, поскольку она даст вам «быстрый сбой», если кто-то изменит поведение метода error
, чтобы он действительно вернулся. (Первая версия приведет к тому, что метод fun
вернет поддельное значение ... что может привести к другим непредвиденным последствиям.)
В связанной точке метод, который отключает JVM путем вызова System.exit()
, может быть проблематичным. Лучшая идея состоит в том, чтобы выбросить непроверенное исключение «конец света» и перехватить его на самом внешнем уровне вашего основного потока. Для исключений, создаваемых в других потоках, одной из идей будет установка обработчика необработанных исключений по умолчанию, который использует Thread.interrupt()
для уведомления основного потока о том, что было сгенерировано исключение "конец света".
Но дело в том, что System.exit()
вызовы, сделанные глубоко в коде, проблематичны; например если вы перепрофилируете свой код для запуска в более крупной среде; например в веб-контейнере.