Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么一个简单布尔值的if/else if/else不给出一个";“无法访问的代码”;错误_Java_Boolean_Unreachable Code - Fatal编程技术网

Java 为什么一个简单布尔值的if/else if/else不给出一个";“无法访问的代码”;错误

Java 为什么一个简单布尔值的if/else if/else不给出一个";“无法访问的代码”;错误,java,boolean,unreachable-code,Java,Boolean,Unreachable Code,为什么该代码没有给出“无法访问的代码”错误?因为布尔值只能为真或假 public static void main(String args[]) { boolean a = false; if (a == true) { } else if (a == false) { } else { int c = 0; c = c + 1; } } 从 如果由于无法访问语句而无法执行该语句,则为编译时错误 及 如果if-then

为什么该代码没有给出“无法访问的代码”错误?因为布尔值只能为真或假

public static void main(String args[]) {
    boolean a = false;
    if (a == true) {

    } else if (a == false) {

    } else {
        int c = 0;
        c = c + 1;
    }
}

如果由于无法访问语句而无法执行该语句,则为编译时错误

如果if-then-else语句是可到达的,则else语句是可到达的

您的if-then-else语句是可访问的。因此,根据定义,编译器认为else语句是可访问的

注意:有趣的是,下面的代码也可以编译

// This is ok
if (false) { /* do something */ }
对于

// This will not compile
while (false) { /* do something */ }
因为
while
的可达性定义不同(重点是我的):

当while语句是可访问的且条件表达式不是值为false的常量表达式时,所包含的语句是可访问的


请参阅此问题的后半部分:同样有趣的是:JLS中的一个检查给出了答案(一如既往):“如果可以访问if-then-else语句,则可以访问else语句。”。由于
if
else if
都是可访问的,因此
else
语句也是可访问的。@Kidiskidvogingogin否,您会将它与作为对象的
Boolean
混淆<代码>布尔值
是基本值。在多线程环境中,如果变量再次为真,则当它刚到达else时,它可能是假的。我不知道这是否是Java设计人员的想法,但是使用
if(编译时常量表达式){…}
编译时常量表达式可能为真或假的构造,具体取决于环境。@zwol这正是这种行为存在的原因。我还想记住,在JVM的第一个版本中,
if(false)
是不可编译的,因为它显然是不可访问的。还要注意,在开发调试目的时,在一个方法的中间,这个行为很方便地放在<代码> >(true){返回;}。编译器完全知道后面的所有内容都是不可访问的,但它仍然允许您编写它,因为拥有它非常有用。