如果有以下代码,我会在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()
在某处定义。
这是什么原因?
答案 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 < 10
和if
分支,而在第二种情况下,它无法知道被调用函数返回的值。
答案 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中的值未知,第二部分也永远不会执行。