3

如果有以下代码,我会在 else if 代码中正确地在 eclipse 中收到警告:

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()在某处定义。

这是什么原因?

4

7 回答 7

11

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

final int x = getX();

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

相关问题:

于 2013-03-05T18:41:37.693 回答
3
final int x = 8;
    if (x < 10) {
        System.out.println(x);
    } else if (x < 5) {
        System.out.println();
    }

在这里,您将 value 声明为 8。

所以 if 将执行。没有执行 else 的可能性。

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

于 2013-03-05T18:41:24.260 回答
0

If this holds x<5

Then this also holds x<10.

Therefore, the second part will never execute even the value in x is unknown.

于 2013-03-05T18:50:08.333 回答
0

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

于 2013-03-05T18:41:40.473 回答
0

在编译时,编译器知道 x 总是 8。但是如果你使用一个函数,它就不会深入研究它。

于 2013-03-05T18:41:51.820 回答
0

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

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

于 2013-03-05T18:42:03.640 回答
0
if (8 < 10) {
  //Executing code
} else {
  if (8 < 5) {
    //Alternative code
  }
}

我相信这是编译器如何读取代码的基本等价物(比我有更多知识的人可能无法纠正我。从头开始,我确信他们可以纠正我)。

话虽如此,如果您查看步骤的逻辑顺序,您会发现编译器已经确定了执行步骤,并且可以确定第二个 if 永远不会满足。如果您getX()交替使用,尽管编译器无法做出这些假设。

于 2013-03-05T18:43:11.093 回答