if-else结构中无法访问的代码

时间:2013-03-05 18:38:43

标签: java if-statement compiler-construction

如果有以下代码,我会在eclipse中正确地在else处获得警告,如果代码:

final int x = 8;
if (x < 10) {
    System.out.println(x);
} else if (x < 5) {
    System.out.println(x);
}

但如果我更换行

,我不会收到任何警告
final int x = 8;

final int x = getX();

getX()在某处定义。

这是什么原因?

7 个答案:

答案 0 :(得分:10)

JVM知道x 始终在编译时会小于10,但是如果你替换x声明

final int x = getX();

JVM将知道x值仅在运行时进行比较

相关问题:

答案 1 :(得分:3)

final int x = 8;
    if (x < 10) {
        System.out.println(x);
    } else if (x < 5) {
        System.out.println();
    }

此处您将值声明为8。

所以如果会执行。没有可能执行其他。

但在第二种情况下,我们首先不知道该值。在运行时只知道它。

答案 2 :(得分:0)

如果编写final int x = 8;,编译器确定始终执行x < 10if分支,而在第二种情况下,它无法知道被调用函数返回的值。

答案 3 :(得分:0)

在编译时,编译知道x总是为8.但是如果你使用一个函数,它就不会向下钻取。

答案 4 :(得分:0)

最终原语是编译时常量,因此它可以在编译时执行无法访问的代码检查。在这种情况下,编译器知道x = 8并且可以相应地确定if语句的结果。

对于getX()方法,它不会在编译时进行检查。这意味着您不会看到该警告。

答案 5 :(得分:0)

if (8 < 10) {
  //Executing code
} else {
  if (8 < 5) {
    //Alternative code
  }
}

我相信这是编译器如何读取代码的基本等价物(有更多知识的人可能能够纠正我。抓住这一点,我确信他们可以纠正我)。

如果你看一下你的步骤的逻辑顺序,你会看到编译器已经确定了执行的步骤,并且可以确定第二个if永远不会满足。如果您使用getX(),但编译器无法做出这些假设。

答案 6 :(得分:0)

如果这样的话 X小于5

然后这也成立了 X&LT; 10

因此,即使x中的值未知,第二部分也永远不会执行。