如果有以下代码,我会在 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()
在某处定义。
这是什么原因?
如果有以下代码,我会在 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()
在某处定义。
这是什么原因?
JVM
知道 x在编译时总是小于 10,但是如果你替换x
声明
final int x = getX();
JVM
将知道x
仅在运行时比较的值
final int x = 8;
if (x < 10) {
System.out.println(x);
} else if (x < 5) {
System.out.println();
}
在这里,您将 value 声明为 8。
所以 if 将执行。没有执行 else 的可能性。
但在第二种情况下,首先我们不知道值。在运行时只有它知道。
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.
如果您编写final int x = 8;
编译器肯定知道x < 10
并且if
总是执行分支,而在第二种情况下,它无法知道被调用函数返回的值。
在编译时,编译器知道 x 总是 8。但是如果你使用一个函数,它就不会深入研究它。
最终原语是编译时间常数,因此它可以在编译时进行无法访问的代码检查。在这种情况下,编译器知道x = 8
并可以相应地确定 if 语句的结果。
对于这种getX()
方法,它不会在编译时进行检查。这意味着您不会看到该警告。
if (8 < 10) {
//Executing code
} else {
if (8 < 5) {
//Alternative code
}
}
我相信这是编译器如何读取代码的基本等价物(比我有更多知识的人可能无法纠正我。从头开始,我确信他们可以纠正我)。
话虽如此,如果您查看步骤的逻辑顺序,您会发现编译器已经确定了执行步骤,并且可以确定第二个 if 永远不会满足。如果您getX()
交替使用,尽管编译器无法做出这些假设。