在 java 开头带有 default 子句的 switch 语句

Posted

技术标签:

【中文标题】在 java 开头带有 default 子句的 switch 语句【英文标题】:switch statement with an default clause at the beginning java 【发布时间】:2015-01-12 22:43:03 【问题描述】:

以下代码打印出1,2,3,如果我更改int i = 3;,它将打印出3。我想知道这背后的原因。我使用了调试器,似乎i = 3 转到案例 3 并打印出 3 然后程序终止。我相信当 i=5 转到 default 时,这是否意味着 case 1,case 2 and case 3 都属于 default条款?

int i = 5;
switch(i)
default:
case 1:
    System.out.println(1);
case 2:
    System.out.println(2);
case 3:
    System.out.println(3);


编辑: 这个问题来自一个测试,它要求这个代码的输出。所以我想弄清楚为什么输出是1,2,3,我知道需要break;,但这不是我想要的答案。

【问题讨论】:

你需要break;在每个case的末尾声明,否则执行将/* fall through */到它下面的case。 @rgettman 感谢您的提醒,但这不是我的问题,我离开了'break;'故意为这个问题而出的。 事实上,确实如此。 break 语句的缺失完全解释了您的输出,以及为什么有些案例似乎“属于”其他案例。 那么请重新插入。 breaks 在这里是必不可少的。 “属于默认子句”并不是一个真正有意义的事情。事物不属于从句;只是switch可以去的地方,default的情况是在开头。 【参考方案1】:

i == 5 与您的任何cases 都不匹配,因此控制权转到default 子句。

default 子句是空的,没有break 语句,它立即将falls through 指向下面的case — 您的代码中的case 1

case 1 打印出"1",并且由于它也没有break 语句,因此会落入case 2,依此类推。


cases 1, 2, 3 不属于 default——重要的是他们的顺序。

如果您重新排序您的开关statement 并将default 子句写为最后一个子句,它不会打印任何内容。

【讨论】:

【参考方案2】:

如果您在任何情况下都没有中断或默认设置,它将失败,直到找到中断或案例块结束。因此,在您的情况下,由于您没有默认中断,因此一直到最后。如果不中断,您的程序将为 i>3 打印 1,2,3。

【讨论】:

是的@5gon12eder 你是对的我已经删除了always。

以上是关于在 java 开头带有 default 子句的 switch 语句的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有 WITH 子句的 INSERT 语句?

switch语句是否应该包含默认子句?

s-s-rS 报告在 IF 子句中使用聚合表达式?

带有字符串列的 SQL 之间的子句

使用更改的 WHERE 子句访问直通查询

在 HIVE 插入查询中,为啥 from 子句在开头?