if-else 结构中无法访问的代码

问题描述 投票:0回答:7

如果有以下代码,我会在 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()
在某处定义。

这是什么原因?

java if-statement
7个回答
11
投票

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

final int x = getX();

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

相关问题:


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

这里您声明值为 8。

所以if会执行。没有可能执行else。

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


0
投票

如果你写

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


0
投票

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


0
投票

final原语是一个编译时常量,因此它可以在编译时进行不可达代码检查。在这种情况下,编译器知道

x = 8
并可以相应地确定 if 语句的结果。

对于

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


0
投票
if (8 < 10) {
  //Executing code
} else {
  if (8 < 5) {
    //Alternative code
  }
}

我相信这与编译器读取代码的方式基本相同(比我更有知识的人可能能够纠正我。从头开始,我确信他们可以纠正我)。

话虽如此,如果您查看步骤的逻辑顺序,您会发现编译器已经确定了执行步骤,并且可以确定第二个 if 永远不会满足。如果您交替使用

getX()
,尽管编译器无法做出这些假设。


0
投票

如果这成立 x<5

那么这也成立 x<10.

因此,即使 x 中的值未知,第二部分也永远不会执行。

© www.soinside.com 2019 - 2024. All rights reserved.