如果有以下代码,我会在 Eclipse 中的 else if 代码处正确收到警告:
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 always 在编译时会小于 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();
}
这里您声明值为 8。
所以if会执行。没有可能执行else。
但在第二种情况下,我们首先不知道该值。在运行时只有它知道。
如果你写
final int x = 8;
,编译器肯定知道 x < 10
和 if
分支总是被执行,而在第二种情况下,它无法知道被调用函数返回的值。
在编译时,编译器知道 x 始终为 8。但是如果您使用函数,它不会深入到该值。
final原语是一个编译时常量,因此它可以在编译时进行不可达代码检查。在这种情况下,编译器知道
x = 8
并可以相应地确定 if 语句的结果。
对于
getX()
方法,它不会在编译时进行该检查。这意味着您不会看到该警告。
if (8 < 10) {
//Executing code
} else {
if (8 < 5) {
//Alternative code
}
}
我相信这与编译器读取代码的方式基本相同(比我更有知识的人可能能够纠正我。从头开始,我确信他们可以纠正我)。
话虽如此,如果您查看步骤的逻辑顺序,您会发现编译器已经确定了执行步骤,并且可以确定第二个 if 永远不会满足。如果您交替使用
getX()
,尽管编译器无法做出这些假设。
如果这成立 x<5
那么这也成立 x<10.
因此,即使 x 中的值未知,第二部分也永远不会执行。