Компилятор Java имеет ограниченную возможность предсказать, может ли какая-либо конкретная строка кода в программе достигать . Этот факт не является ошибкой дизайнеров Java; это подтвержденный факт , что невозможно полностью предсказать поведение всех возможных программ языка общего назначения. Единственный выбор, который могли бы сделать разработчики Java, заключается в том, насколько ограничена эта возможность компилятора должна быть.
См Why does Java have an "unreachable statement" compiler error? для обсуждения, почему компилятор имеет эту способность на всех, почему он считает «недостижимый код» ошибка, и почему некоторые вещи, которые могли бы (относительно легко), были обнаружены в «недостижимого кода «не считаются ошибками« недостижимого кода » компилятором.
В вашем конкретном случае, тот факт, что 1/0
всегда будут бросать исключения, вместе с тем, что есть в catch
блоке, который ловит исключение и return
, предотвратит выполнение программы из когда-либо писать " TEST "на выход. Но компилятор Java не пытается учитывать исключения, вызванные такими вещами, как 1/0
, когда он ищет недостижимый код. Поэтому он действует, как если бы были возможный путь управления, который выполнен в try
блок, сделал не сгенерирует исключение (так и не выполнить какой-либо код в catch
блоке), затем выполнил finally
блок, а затем код после блока finally
.
Одна из вещей, что компилятор действительно считают является то, что finally
блок будет всегда выполнять перед кодом, который следует за ним, и что если есть return
в finally
блоке, код после return
не будет выполняться вообще. Поэтому a return
в блоке finally
сделает код после его недостижимости.
TL; DR: В одном случае оператор «TEST» недостижим по причинам, компилятор Java предназначен для признает; в другом случае оператор TEST недоступен по причинам, что компилятор Java - , а не, предназначенный для распознавания.
Поскольку у вас есть 'return' в' catch', и ваш код имеет деление на ноль, что приводит к исключению. –