Я только что заметил этот вопрос и хотел добавить к нему свои $ .02.
В случае с Java это на самом деле не вариант.Ошибка «недостижимый код» не связана с тем, что разработчики JVM думали защитить разработчиков от чего-либо или быть более бдительными, а с требованиями спецификации JVM.
И компилятор Java, и JVM,использовать так называемые «стековые карты» - определенную информацию обо всех элементах стека, выделенных для текущего метода.Тип каждого и каждого слота стека должен быть известен, чтобы инструкция JVM не плохо относилась к элементу одного типа для другого типа.Это главным образом важно для предотвращения использования числового значения в качестве указателя.Можно, используя Java-сборку, попытаться передать / сохранить число, но затем выгрузить / загрузить ссылку на объект.Однако JVM отклонит этот код во время проверки класса, то есть, когда карты стека создаются и проверяются на согласованность.
Чтобы проверить карты стека, виртуальная машина должна пройти по всем путям кода, которые существуют вметод и убедитесь, что независимо от того, какой путь к коду будет выполнен, данные стека для каждой инструкции согласуются с тем, что любой предыдущий код поместил / сохранил в стеке.Таким образом, в простом случае:
Object a;
if (something) { a = new Object(); } else { a = new String(); }
System.out.println(a);
в строке 3 JVM проверит, что обе ветви 'if' сохранили только в (который является просто локальной переменной # 0) что-то, совместимое с Object(так как код из строки 3 и далее будет обрабатывать локальную переменную # 0).
Когда компилятор получает недоступный код, он не совсем знает, в каком состоянии может находиться стек в этой точке, поэтому онне может проверить его состояние.В этот момент он больше не может скомпилировать код, так как он также не может отслеживать локальные переменные, поэтому вместо того, чтобы оставить эту двусмысленность в файле классов, он приводит к фатальной ошибке.
Конечнопростое условие, подобное if (1<2)
, обманет его, но на самом деле оно не обманывает - оно дает ему потенциальную ветвь, которая может привести к коду, и, по крайней мере, и компилятор, и виртуальная машина могут определить, как элементы стека могут использоваться изтам.
PS Я не знаю, что .NET делает в этом случае, но я верю, что компиляция также не удастся.Обычно это не будет проблемой для любых компиляторов машинного кода (C, C ++, Obj-C и т. Д.)