为什么Java中的“切换”依赖于“中断”?

时间:2013-08-22 04:24:11

标签: java

class switch1
{
    public static void main(String args[])
    {
        int a = 10;
        switch(a)
        {
            default: System.out.println("Default");
            case -1: System.out.println("-1");
        }
    }
}

据我所知,该程序将执行“default”和“case -1”语句,因为在匹配条件之后未指定break(在本例中是“default”之后)。

但我不明白的是

a)为什么break声明需要switch

b)为什么它甚至执行无效的匹配条件的语句(即执行“case -1”))如果它只是匹配的话?

9 个答案:

答案 0 :(得分:13)

有时您需要多个案例才能执行相同的功能。例如,我让用户指定模式1或模式32表示32位模式,模式2或模式64表示64位模式。

switch (input) {

    case 1:
    case 32:
        /* Do 32-bit related code */
        break;
    case 2:
    case 64:
        /* Do 64-bit related code */
        break;
    default:
        System.out.println("Invalid input");

}

这就是休息很重要的原因。它们告诉switch语句何时停止执行给定方案的代码。此外,默认设置通常用于开关与任何情况不匹配时。

答案 1 :(得分:3)

没有switch

break语句允许您执行以下操作:

// Compute the most significant bit set in a number from 0 to 7
int topBit = -1;
switch(n) {
case 0:
    topBit = 0;
    break;
case 1:
    topBit = 1;
    break;
case 2:
case 3:
    topBit = 2;
    break;
case 4:
case 5:
case 6:
case 7:
    topBit = 3;
    break;
}

基本上,它允许您创建一组标签,并在顶部有一个条件,让您跳转到初始标签一次。之后,执行将持续到break,或者到达switch的末尾。这种技术已经很久了 - 它自组装时间开始就已存在,并且由于被包含在C中,它已经进入Java和其他几种语言。

答案 2 :(得分:1)

break语句是必要的,因为没有它们,switch块中的语句都会失败:匹配的case标签之后的所有语句都按顺序执行,而不管后续case标签的表达式,直到遇到break语句。

请查看此文档:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

答案 3 :(得分:1)

对于a。,要求使用break允许使用简写符号,其中公共代码可以放在底部块。在某些情况下,这可能会使代码更具可读性。

有关详细信息,请参阅“Switch statement fallthrough in C#?”。

至于b。,因为它匹配default情况,所以执行该行。由于该块中不存在break,因此无论匹配如何,都会执行下一行。

尝试

switch (a)
{
    case 10: System.out.println("This is 10.");
    case 9 : System.out.println("This is 9.");
             break;
    case 8 : System.out.println("This is 8.");
             break;
    default: System.out.println("Default");
}

因为匹配情况没有中断,所以输出为

This is 10.
This is 9.

将此设置与a设置为11,9或8进行比较。

答案 4 :(得分:1)

来自Java Language Specification section on the break statement

  

break语句将控制转移到封闭语句之外。

和...

  

休息声明......总是突然完成

a)它只允许将控制转移出case语句。

b)它执行不符合预期匹配条件的原因是因为有一些特殊情况下,通过案例陈述被认为是有效的(取自The Java Tutorials):

List<String> futureMonths = new ArrayList<String>();
int month = 8;
switch (month) {
    case 1:  futureMonths.add("January");
    case 2:  futureMonths.add("February");
    case 3:  futureMonths.add("March");
    case 4:  futureMonths.add("April");
    case 5:  futureMonths.add("May");
    case 6:  futureMonths.add("June");
    case 7:  futureMonths.add("July");
    case 8:  futureMonths.add("August");
    case 9:  futureMonths.add("September");
    case 10: futureMonths.add("October");
    case 11: futureMonths.add("November");
    case 12: futureMonths.add("December");
             break;
    default: break;
}

for (String monthName : futureMonths) {
    System.out.println(monthName);
}

哪个输出:

  

八月

     9月

     十月

     11月

     

答案 5 :(得分:1)

  

a)为什么switch语句在很大程度上依赖于break语句来实现其目的?

因为这是他们定义它的方式。它是从C.复制的。帕斯卡没有堕落,所以它也没有中断。它还有Java缺乏的案例范围。语言允许不同。或者相同。

  

b)为什么它甚至执行无效的匹配条件的语句(即执行“case -1”))

因为这是他们定义它的方式,如果你没有休息,可以通过实践。

  

如果一切都匹配?

我不明白这个问题。它不匹配。它会对相关案例进行索引跳转,如果你没有休息,则会跳到下一个语句。

答案 6 :(得分:0)

如果将break添加到循环中,它将取消循环。所以对于一个switch语句,它会转到正确的大小写,一旦它在那里它执行代码,直到break然后它将退出switch statemnt。如果你删除了它,它会继续到下一个case直到看到休息。如果没有break;,代码将崩溃。

所以基本上它将不同的情况分开

答案 7 :(得分:0)

在Switch案例中,兴趣点是break语句。

  

每个break语句都会终止封闭的switch语句。   控制流继续切换后的第一个语句   块。 break语句是必要的,因为没有它们,   switch块中的语句落在:所有语句之后   匹配的案例标签按顺序执行,无论如何   后续case标签的表达式,直到break语句为止   遇到。

程序SwitchDemoFallThrough显示掉落的交换机块中的语句。该程序显示对应于整数月份的月份以及该年度中的月份:

公共类SwitchDemoFallThrough {

public static void main(String[] args) {
    java.util.ArrayList<String> futureMonths =
        new java.util.ArrayList<String>();

    int month = 8;

    switch (month) {
        case 1:  futureMonths.add("January");
        case 2:  futureMonths.add("February");
        case 3:  futureMonths.add("March");
        case 4:  futureMonths.add("April");
        case 5:  futureMonths.add("May");
        case 6:  futureMonths.add("June");
        case 7:  futureMonths.add("July");
        case 8:  futureMonths.add("August");
        case 9:  futureMonths.add("September");
        case 10: futureMonths.add("October");
        case 11: futureMonths.add("November");
        case 12: futureMonths.add("December");
                 break;
        default: break;
    }

    if (futureMonths.isEmpty()) {
        System.out.println("Invalid month number");
    } else {
        for (String monthName : futureMonths) {
           System.out.println(monthName);
        }
    }
}

}

这是代码的输出:

八月 九月 十月 十一月 腊

从技术上讲,不需要最后的中断,因为flow不属于switch语句。建议使用中断,以便更容易修改代码并减少错误。默认部分处理其中一个案例部分未明确处理的所有值。

在此处查看有关switch

的完整信息

答案 8 :(得分:0)

a)为什么在开关中出现跌倒/要求中断?

在某些情况下,跌倒行为很有用,但问题在于它在常见情况下是额外的工作。因此,期望在更现代的语言中不需要“break”关键字是合理的

那为什么呢?为了匹配C ++(Java设计时的主导语言)的行为,它再次匹配C的行为(C ++设计时的主导语言)。至于C,它(以及B和BCPL,它的前身)通常看起来像它可以更容易地构建一个有效的编译器。基本上switch语句的工作方式是在汇编程序中实现它的自然方式。

b)它的行为方式逻辑上遵循决定使用堕落。