# Java 中的无效代码和无法访问的代码

> 原文： [https://howtodoinjava.com/puzzles/dead-code-and-unreachable-code-in-java-puzzle/](https://howtodoinjava.com/puzzles/dead-code-and-unreachable-code-in-java-puzzle/)

学习识别 Java 中的无效代码和无法访问的代码。 在您的 [Java 面试](https://howtodoinjava.com/java-interview-questions/)编码问题中可能会提出这样的谜题。

## 1.无效代码和无法访问的代码错误

为了理解死代码，在这个难题中，我在下面给出了一段代码。 如果代码是在 Eclipse IDE 中编译的，请尝试确定代码中的问题。

```java
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");
    }
}

```

我将在下一节中给出上述难题的答案，但我建议您先尝试一下。 它只是为了好玩。

## 2.解决方案 – 代码无效

我们所有人都必须面对与“ **Unreachable code** ”相关的编译**错误**，并且有些人可能已经注意到“ **无效代码警告**”。 以上难题仅与他们有关。

在第一种方法`howToDoInJava_method1()`中，第二条打印语句无法访问，因此编译器会出于明显的原因而抱怨。

在第二种方法`howToDoInJava_method2()`中，第二条打印语句也无法访问，但是奇怪的编译器只会警告您。 稍后我们将尝试在这里获得逻辑。

同样在第三种方法`howToDoInJava_method3()`中，第二条打印语句不可访问，因此编译器将再次发出错误消息。

为什么！

## 3.什么是死代码

方法 2 中无法访问的代码称为“ **死代码**”。 这是**纯粹是 Eclipse 编译器报告的错误**，如果您使用“ ***javac*** ”编译上述类，则 Java 内置编译器将仅抱怨其他两种方法。 [第一和第三]。

> **引用 Java 语言规范 –**
> 
> “我们的想法是，从包含该语句的构造器，方法，实例初始化器或静态初始化器的开始，必须有一些可能的执行路径。 分析考虑了语句的结构。
> 
> 除了对条件表达式具有恒定值 **true** 的`while`，`do`和`for`语句进行特殊处理外，在流量分析中不考虑其他表达式的值。

这意味着在确定不可访问的代码时不会考虑`'if'`块。 因为如果您通过`'if'`语句的路径之一，则可以到达第二个 print 语句。 一切都取决于编译器，它在编译期间确定了这一点。

在其他两个语句中，编译器确定了不可访问性，因此它抱怨错误。

如果我们再次像这样重写第二种方法。

```java
public void howToDoInJava_method2() 
{
	System.out.println("how to do");

	if (true) 
	{
		return;
	}
	else
	{
		return;
	}

	System.out.println("in java");
}

```

现在，编译器确定它根本无法到达最后一个打印语句，因此`'javac'`再次报告了第二种方法的不可达代码。

如果您仍然对 Java 中的**无效代码有疑问，请在注释部分写下。 我将尝试解决您的查询。**

学习愉快！