Мертвый код и недостижимый код в Java

Научитесь определять мертвый код и недостижимый код в Java. Это может быть предложено на собеседовании по Java в виде головоломки.

1. Мертвый код и недостижимый код

Чтобы понять концепцию мертвого кода, в этой головоломке я привел фрагмент кода ниже. Попробуйте определить проблемы в коде, если он скомпилирован в IDE.

public class IdentifyProblemsInCode {public void howToDoInJava_method1() {System.out.println("how to do");return;System.out.println("in java");}public void howToDoInJava_method2() {System.out.println("how to do");if(true) {return;}System.out.println("in java");}public void howToDoInJava_method3() {System.out.println("how to do");while(true) {return;}System.out.println("in java");}}

Мы получаем следующие ошибки компиляции:

PS C:\Users\lokesh\IdeaProjects\Core-Java\src\main\java\com\howtodoinjava\puzzles> javac .\IdentifyProblemsInCode.java.\IdentifyProblemsInCode.java:8: error: unreachable statementSystem.out.println("in java");^.\IdentifyProblemsInCode.java:24: error: unreachable statementSystem.out.println("in java");^2 errors 

Я дам ответ на головоломку выше в следующем разделе, но я бы рекомендовал вам сначала попробовать решить ее самостоятельно. Это только для развлечения.

2. Ошибки компиляции

Мы все наверняка сталкивались с ошибками компиляции, связанными с «Недостижимым кодом», а некоторые могли заметить «Предупреждение о мертвом коде». Вышеприведенная головоломка относится только к ним.

  • В первом методе howToDoInJava_method1() второй оператор печати недоступен, поэтому компилятор выдаст сообщение об ошибке по невыясненным причинам.
  • Во втором методе howToDoInJava_method2() второй оператор печати также недоступен, но странно то, что компилятор только предупреждает. Позже мы попытаемся получить логику здесь.
  • В третьем методе howToDoInJava_method3() второй оператор печати также недоступен, поэтому компилятор снова выдаст сообщение об ошибке.

Почему !!

3. Что такое мертвый код?

Недостижимый код в методе 2 называется «Мертвый код». Это ошибка, сообщаемая исключительно компилятором Eclipse, и если вы скомпилируете указанный выше класс с помощью «javac», встроенный компилятор Java выдаст сообщение только о двух других методах. [Первый и третий].

Цитата из спецификации языка Java –

«Идея заключается в том, что должен быть некоторый возможный путь выполнения от начала конструктора, метода, инициализатора экземпляра или статического инициализатора, содержащего оператор, до самого оператора. Анализ учитывает структуру операторов.

За исключением специальной обработки while, do и операторов, выражение условия которых имеет постоянное значение true, значения других выражений не учитываются при анализе потока».

Это означает, что блок 'if' не учитывается при определении недостижимого кода. Так как если вы пройдете по одному из путей оператора 'if', вы можете достичь второго оператора print. Все зависит от компилятора, который определяет это во время компиляции.

В двух других операторах компилятор определил недостижимость, поэтому выдает сообщение об ошибке.

Если мы перепишем второй метод еще раз, вот так.

public void howToDoInJava_method2(){System.out.println("how to do");if(true){return;}else{return;}System.out.println("in java");}

Теперь компилятор определяет, что он никак не может достичь последнего оператора печати, поэтому «javac» снова сообщает о недостижимом коде и для этого второго метода.

Если у вас все еще есть сомнения, связанные с мертвым кодом в Java, пожалуйста, напишите их в разделе комментариев. Я постараюсь разрешить ваши вопросы.

Исходный код на Github

Прокрутить вверх