【问题标题】:Should the default case of switch statment have a break?switch 语句的默认情况是否应该有中断?
【发布时间】:2014-07-25 18:36:54
【问题描述】:

例如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 语句中使用中断是合理的,或者具体说在末尾添加中断语句可以减少代码出错的可能性。如果我在默认情况下抛出异常,是否有必要在之后调用 break 或者这是一种浪费?在 Netbeans 中一红!出现在无法访问的 break 语句旁边,但它编译得很好。

关于可读性,如果满足条件时运行的代码跨越多行,应该如何格式化 case 块?例如,不仅仅是monthString = "January";,还有 10 行带有循环和东西的代码?

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

【问题讨论】:

  • "如果我在默认情况下抛出异常,是否有必要在之后调用 break 或者这是一种浪费?" - 抛出异常后做任何事情是没有意义的。
  • 当我使用 IDE 添加 case 语句时,它会将它们放在最后。最后使用break; 恕我直言,不容易出错。
  • 在本例中,我将使用数组而不是 switch 语句。 (一两行代码)

标签: java switch-statement maintainability


【解决方案1】:

如果您在默认情况下抛出异常,break 将永远不会被执行,因此您可以将其保留。我个人在处理一般开关时使用大括号来避免可读性差。

例如:

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

没有大括号,而是很好的缩进,它的可读性也很好。 示例:

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

【讨论】:

    【解决方案2】:

    我不确定第二句话是否证明了在 switch 语句中使用 break 是合理的,还是特别指出在结尾添加 break 语句可以降低代码出错的可能性。

    后者。

    如果我在默认情况下抛出异常,是否有必要在之后调用 break 或者这是一种浪费?

    浪费。非新手认识到抛出异常是事实上的中断。使代码健壮是一回事,试图对初学者和白痴进行防弹是浪费时间。他们会找到其他方法来打破它。

    在 Netbeans 中是红色的!出现在无法访问的 break 语句旁边,但可以正常编译。

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

    关于可读性,如果满足条件时运行的代码跨越多行,应该如何格式化 case 块?例如,不仅仅是 monthString = "January";有 10 行带有循环和东西的代码吗?

    考虑把它放在一个单独的方法中。

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

    在这种情况下,您是否需要一个默认值?在 switch 中不需要。

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

    【讨论】:

      【解决方案3】:

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

       if(true)
           do x;
       else
           do y;
      

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-26
        • 2020-07-11
        • 2011-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多