switch语句的默认情况是否有中断?

时间:2014-07-25 18:36:55

标签: java switch-statement maintainability

示例from Oracle

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

        int month = 8;
        String monthString;
        switch (month) {
            case 1:  monthString = "January";
                     break;
            case 2:  monthString = "February";
                     break;
            case 3:  monthString = "March";
                     break;
            case 4:  monthString = "April";
                     break;
            case 5:  monthString = "May";
                     break;
            case 6:  monthString = "June";
                     break;
            case 7:  monthString = "July";
                     break;
            case 8:  monthString = "August";
                     break;
            case 9:  monthString = "September";
                     break;
            case 10: monthString = "October";
                     break;
            case 11: monthString = "November";
                     break;
            case 12: monthString = "December";
                     break;
            default: monthString = "Invalid month";
                     break; //why is there a switch statement here?
        }
        System.out.println(monthString);
    }
}

页面解释

  

从技术上讲,不需要最后的休息时间因为流量不足   switch语句。建议使用中断以便修改   代码更容易,更不容易出错。默认部分处理   其中一个案例未明确处理的所有值   部分。

我不确定第二句是否证明在switch语句中使用中断是合理的,或者具体说是在末尾添加break语句会使代码更容易出错。如果我在默认情况下抛出异常,那么之后是否有人打电话给休息或这是浪费?在Netbeans中红了!出现在无法访问的break语句旁边,但它编译得很好。

关于可读性,如果满足条件时运行的代码跨越多行,如何格式化大小写?例如,而不仅仅是monthString = "January";,有10行代码包含循环和事物?

我正在使用开关测试用户是否输入了选项1,2或3的编号。

3 个答案:

答案 0 :(得分:1)

  

我不确定第二句是否证明在switch语句中使用中断是合理的,或者具体说是在末尾添加break语句会使代码更容易出错。

后者。

  

如果我在默认情况下抛出异常,那么之后是否可以打电话给休息或者这是浪费?

废料。非新手认识到抛出异常是事实上的突破。使代码健壮是一回事,试图对初学者和蠢货进行防范是浪费时间。他们只会采取其他方式来打破它。

  

在Netbeans中红了!出现在无法访问的break语句旁边,但它编译得很好。

是的,但你不想要那些红色的!摆脱它。

  

关于可读性,如果满足条件时运行的代码跨越多行,如何格式化大小写?例如,而不仅仅是monthString =" January&#34 ;;有10行代码的循环和东西?

考虑将其放在一个单独的方法中。

  

我使用开关测试用户是否输入了选项1,2或3的数字。

在这种情况下,你需要一个默认值吗?在交换机中不需要它。

我认为在大多数情况下默认是一个非常糟糕的主意。例外情况是可能将无效值传递给switch语句,您需要对此做些什么(抛出异常,显示消息,等等)。否则,每个可能的值都应该有一个案例,即使它是空的,这样就可以清楚地表明该值是有效的,但是你打算不做任何事情。

答案 1 :(得分:0)

如果在默认情况下抛出异常,则永远不会执行中断,因此您可以将其保留。我个人使用大括号来避免在处理交换机时的可读性差。

例如:

switch (variable) {
   case 1: {
       code;
       mode code;
       break;
   }
   default: {
       break;
   }
}

没有大括号,反而很好地缩进它也很好读。 例如:

    switch (variable) {
       case 1: 
           code;
           mode code;
           break;
       default: {
           break;   
    }

答案 2 :(得分:0)

虽然它不是必需的(因为它会在没有break语句的情况下退出)我认为在你的默认情况下包含break;是一个好习惯。很多时候,当我们开始认为我们知道这一切时,如果我们坚持使用基础知识,我们最终会引入一个很容易被阻止的错误。 It's a matter of consistency。它类似于对单行条件语句使用大括号,如下所示:

 if(true)
     do x;
 else
     do y;

VS

if(true) {
    do x;
} else {
    do y;
}

以苹果众所周知的SSL / TLS错误https://www.imperialviolet.org/2014/02/22/applebug.html

为例