192.md 3.5 KB
Newer Older
W
wizardforcel 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
# 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");
    }
}

```

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

W
wizardforcel 已提交
41
## 2.解决方案 – 代码无效
W
wizardforcel 已提交
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56

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

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

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

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

为什么!

## 3.什么是死代码

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

W
wizardforcel 已提交
57
> **引用 Java 语言规范 –**
W
wizardforcel 已提交
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
> 
> “我们的想法是,从包含该语句的构造函数,方法,实例初始化程序或静态初始化程序的开始,必须有一些可能的执行路径。 分析考虑了语句的结构。
> 
> 除了对条件表达式具有恒定值 **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 中的**无效代码有疑问,请在注释部分写下。 我将尝试解决您的查询。**

学习愉快!