Java Switch语句默认情况下失败

Java Switch语句默认情况下失败,java,scjp,Java,Scjp,这里有一点小混乱,请原谅我的无知。下面是一段代码片段 public class SwitchTest { public static void main(String[] args) { int x = 2; switch (x) { case 1: System.out.println("1"); break; default:

这里有一点小混乱,请原谅我的无知。下面是一段代码片段

public class SwitchTest {
    public static void main(String[] args) {

        int x = 2;

        switch (x) {
            case 1:
                System.out.println("1");
                break;
            default:
                System.out.println("helllo");
            case 2:
                System.out.println("Benjamin");
                break;

        }

    }
}
这里,如果x的值为2,则只打印Benjamin。那很好。现在让我们假设,我将x的值更改为3,不匹配任何情况,而不是默认情况下的默认值。Ain编译器不需要匹配3的每一个案例,到那个时候案例2将被传递,这就是为什么它返回到默认值并打印hello Benjamin。有人能解释一下吗


谢谢,

它会打印两个字符串,因为默认情况下没有中断,所以它会继续到情况2,打印Benjamin。您可以通过添加中断或将案例2移动到默认案例上方来解决此问题。

它会打印两个字符串,因为您的默认案例中没有中断,所以它会继续到案例2,打印Benjamin。您可以通过添加中断或将案例2移动到默认案例上方来解决此问题。

您需要添加中断;语句以断开开关块

注意块将如何跳转到默认情况,并将其保存到以后,除非我们已用尽所有其他可能的情况。

您需要添加一个中断;语句以断开开关块



请注意块将如何跳转到默认情况下,并将其保存到以后,除非我们已用尽所有其他可能的情况。

“switch”情况是“if-then-else”的其他形式,默认情况是最后的else部分。建议在开关的末尾写入默认值。

'switch'大小写是'if then else'的另一种形式,默认大小写是最后一个else部分。建议在开关的末尾写入默认值。

默认值被选中为最后一个。这就是为什么感觉编译器“返回”了。

默认值被选中为最后一个。这就是为什么感觉编译器“回去了”的原因。

注意如何将案例2放在案例1之前。案例没有价值顺序。它们是按外观顺序访问的。如果您没有像默认情况下那样在案例末尾添加break,它将执行下一个案例,直到执行break命令。@SotiriosDelimanolis,这不是我的问题,我的问题是,如果x与任何案例都不匹配,为什么会出现失败。显然,编译器会自上而下地匹配每种情况,但当它的值为3时,它似乎会返回并从默认值中消失。我知道这很简单,但试着理解其中的逻辑。这不是倒退。它与默认值匹配,并适用于案例2。请注意如何将案例2放在案例1之前。案例没有价值顺序。它们是按外观顺序访问的。如果您没有像默认情况下那样在案例末尾添加break,它将执行下一个案例,直到执行break命令。@SotiriosDelimanolis,这不是我的问题,我的问题是,如果x与任何案例都不匹配,为什么会出现失败。显然,编译器会自上而下地匹配每种情况,但当它的值为3时,它似乎会返回并从默认值中消失。我知道这很简单,但试着理解其中的逻辑。这不是倒退。它符合默认值,并通过案例2。迈克,我的问题不是这样。我的问题是如果x的值是2,它只打印Benjamin。如果x值i变为3,这是一个失败的例子。它不符合3个案例,一个接一个自上而下的方法吗?@benz我不太确定我是否理解你的要求。您希望看到的行为是什么?如果x==3,它将进入switch语句并说:3==1?这是错误的,所以它跳过了。3==2?,该值为false,因此跳过该值。然后,由于没有其他要检查的情况,它默认为默认情况,这将捕获任何内容。所以它进入那里并打印Hello。因为在默认情况下没有中断,所以开关块永远不会离开,它会继续沿着代码向下移动,直到完成或找到一个中断break@benz我明白你的意思,你的意思是说它是否通过一个开关块自上而下的方式进行。如图所示,它将检查:情况1,情况默认,然后是情况2?事实并非如此,如果没有其他情况是正确的,开关块总是进入默认情况。我认为默认情况将在情况1之后检查,因为它出现在中间。默认值是编译器检查的最后一个案例。我明白了。非常感谢。@benz很高兴能帮上忙:。我更新了我的答案,简要总结了我们在评论中讨论的内容,以备将来参考。迈克,我的问题不是这样。我的问题是如果x的值是2,它只打印Benjamin。如果x值i变为3,这是一个失败的例子。它不符合3个案例,一个接一个自上而下的方法吗?@benz我不太确定我是否理解你的要求。您希望看到的行为是什么?如果x==3,它将进入switch语句并说:3==1?这是错误的,所以它跳过了。3==2?,该值为false,因此跳过该值。然后,由于没有其他要检查的情况,它默认为默认情况,这将捕获任何内容。所以它进入了
她在那儿,打招呼。因为在默认情况下没有中断,所以开关块永远不会离开,它会继续沿着代码向下移动,直到完成或找到一个中断break@benz我明白你的意思,你的意思是说它是否通过一个开关块自上而下的方式进行。如图所示,它将检查:情况1,情况默认,然后是情况2?事实并非如此,如果没有其他情况是正确的,开关块总是进入默认情况。我认为默认情况将在情况1之后检查,因为它出现在中间。默认值是编译器检查的最后一个案例。我明白了。非常感谢。@benz很高兴能帮上忙:。我更新了我的答案,简要总结了我们在评论中讨论的内容,以供将来参考。
switch (x) {
    case 1:
        System.out.println("1");
        break;
    default:
        System.out.println("helllo");
        break; // <-- add this here
    case 2:
        System.out.println("Benjamin");
        break;

    }
x==1? No, check next case
default? Not done yet, check other cases
x==2? No, check next case
//No more cases, so go back to default
default? Yes, do default logic
// no break statement in default, so it falls through to case 2: logic without checking the case
output case 2 logic
break