Java if-else结构中的不可访问代码

Java if-else结构中的不可访问代码,java,if-statement,compiler-construction,Java,If Statement,Compiler Construction,如果有以下代码,我在eclipse中的else If代码中正确地得到了警告: final int x = 8; if (x < 10) { System.out.println(x); } else if (x < 5) { System.out.println(x); } 与 getX()是在某处定义的 原因是什么?final int x=8; final int x = 8; if (x < 10) { System.out.pri

如果有以下代码,我在eclipse中的else If代码中正确地得到了警告:

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

getX()
是在某处定义的

原因是什么?

final int x=8;
final int x = 8;
    if (x < 10) {
        System.out.println(x);
    } else if (x < 5) {
        System.out.println();
    }
if(x<10){ 系统输出println(x); }else if(x<5){ System.out.println(); }
这里您将值声明为8

因此,if将执行。不可能执行其他操作


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

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

final int x = getX();
JVM
将只在运行时知道要比较的
x

相关问题:

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

在编译时,编译器知道x始终是8。但如果使用函数,它不会深入到该函数。

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

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

if(8<10){
if (8 < 10) {
  //Executing code
} else {
  if (8 < 5) {
    //Alternative code
  }
}
//执行代码 }否则{ 如果(8<5){ //替代代码 } }
我相信这与编译器读取代码的方式基本相同(有些人的知识可能比我多,我相信他们可以纠正我)

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

如果这一假设成立
xwhat是
getX()final int x = getX();
if (8 < 10) {
  //Executing code
} else {
  if (8 < 5) {
    //Alternative code
  }
}