gpt4 book ai didi

java - Java7 和 Java8 中 switch-case 语句的行为不一致

转载 作者:行者123 更新时间:2023-11-29 06:58:13 25 4
gpt4 key购买 nike

我正在准备 Java7 Oracle 证书,我想知道为什么 Java 以如此奇怪的方式处理 switch-case:

    public static void main(String[] args) {
int a = 2;
switch (a) {
case 0:
//System.out.println(b); // cannot find symbol variable b
break;
case 1:
boolean b=false;
break;
case 2:
b = true; // how case knows about existence of variable b?
break;
case 3:
//System.out.println(b); // var b might not have been initialized
break;
}
}

很明显,为什么情况 0 和情况 3 会提示未知符号或未初始化的变量,但我无法想象为什么情况 2 可以正常工作?如果 b 在情况 1 中被赋值,编译器如何知道它的类型?对我来说,这是不连贯的。

更新 1:实际上更奇怪的是,在案例 3 中我注意到编译时错误(Linux64、Java7 和 Java8),但我的一些同事没有。

我准备了非常简单的maven项目:https://github.com/gonciarz/switch-test

更新 2:似乎对每个人来说 case3 都无法编译。谢谢你们的澄清。

最佳答案

您混淆了声明和赋值。在你的代码中

case 1:
boolean b=false;
break;
case 2:
b = true; // how case knows about existence of variable b?
break;

变量 bcase 1: 中声明赋值。 声明 的范围是 switch 语句 block 的其余部分,即到 }

这和你写的一样:

case 1:
boolean b;// declaration
b=false; // assignment
break;

分配case 2: 标签的代码流没有影响。如果跳转至 case 2 标签,变量将被声明但不会被赋值,因为可以跳过赋值但不能跳过声明。

因此该行为与您的第三个标签一致:

case 3:
System.out.println(b); // var b might not have been initialized
break;

这里,变量 b声明,但没有赋值。这就是错误消息告诉您的内容:它没有说 b 未声明,而是说它“可能没有被初始化”,这包括您确定知道它没有被初始化的可能性此时初始化。

b类型声明的类型,不依赖于任何赋值。


作为旁注,switchif 之间存在差异。你写了吗

final int a = 2;
boolean b;
if(a == 2) b=false;
System.out.println(b);

a 的常量性质导致编译器检测到 b 将被分配给 false,并且没有生成错误。这适用于 if 但不适用于 switch

关于java - Java7 和 Java8 中 switch-case 语句的行为不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30456174/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com