Я тільки що помітив це запитання і хотів додати до цього свої $ .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 і далі буде обробляти локальний var # 0 ).
Коли компілятор потрапляє до недосяжного коду, він не зовсім знає, в якому стані може бути стек на той момент, тому він не може перевірити його стан. На той момент він вже не може повністю скомпілювати код, оскільки він також не може відстежувати локальні змінні, тому замість того, щоб залишити цю неоднозначність у файлі класу, він видає фатальну помилку.
Звичайно, така проста умова if (1<2)
обдурить, але це насправді не обдурює - вона дає їй потенційну гілку, яка може призвести до коду, і принаймні як компілятор, так і віртуальна машина можуть визначити, як звідти можна використовувати елементи стека на.
PS Я не знаю, що робить .NET у цьому випадку, але я вважаю, що компіляція також не вдасться. Зазвичай це не буде проблемою для будь-яких компіляторів машинного коду (C, C ++, Obj-C тощо)