Java中的switch语句中是否必须包含默认大小写

Java中的switch语句中是否必须包含默认大小写,java,switch-statement,default,Java,Switch Statement,Default,我只是想知道Java中的switch语句中是否必须包含默认情况。我理解将默认情况包括在内是一种良好的做法。我之所以这样问是因为对于下面的代码,如果我删除默认情况,代码将提供错误。有人能帮我澄清一下这个概念吗?提前感谢您的帮助 public class SwitchDemo { public static void main(String[] args) { int month = 8; String monthString; switch

我只是想知道Java中的switch语句中是否必须包含默认情况。我理解将默认情况包括在内是一种良好的做法。我之所以这样问是因为对于下面的代码,如果我删除默认情况,代码将提供错误。有人能帮我澄清一下这个概念吗?提前感谢您的帮助

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"; //if delete will produce error
                     break;
        }
        System.out.println(monthString);
    }
}

虽然
default
子句不是强制性的,但如果将其删除,
monthString
可能无法初始化,因此当您尝试使用
System.out.println(monthString)打印它时,会出现编译错误

如果在声明
monthString
时为其提供默认值,则可以删除
default
子句。例如:

String monthString = "Invalid month";

这将提供与当前switch语句相同的行为,其中包括default子句。

不要求有一个
default
案例,但最好有一个,因为这会捕获您有意不想处理(或无意不处理)的案例

作为参考点,需要一个
默认值
案例

在您的代码中,假设您不受特定样式规则的限制,该规则需要
默认值
情况,那么您就不需要它;在使用
monthString
之前,您只需明确指定它(语言规范中的一项要求)。但是,为1-12范围之外的月份值指定一个值是没有意义的,这在逻辑上是错误的

在这里抛出异常是一件明智的事情,例如:

default:
  throw new IllegalArgumentException("Invalid month");

如果您查看您的程序,您将发现自己的错误,因为初始化错误

这里

 int month = 8;
 String monthString; //it is a local Variable and not Initialized.
monthString
在声明时未初始化,并且此
变量
没有全局访问权限(非全局变量),因此它可以使用任何构造函数或任何其他源进行初始化

在所有
案例中的
switch
语句中
都初始化了变量
monthString
。如果你把每一个代码> >案例< /代码>和<代码>默认< /代码>作为一个不同的分支,那么你会意识到,在所有可能的分支中,这个<代码>代码< /代码>正在被执行。在每个可能性变量中,
monthString
都会初始化,但如果删除此代码

default: monthString = "Invalid month"; //if delete will produce error
                     break;
然后可能会出现
默认
情况(如果所有情况都失败)。因此,间接地,你没有考虑这个默认的代码>代码< < /代码>,但是有可能。

如果仍要删除
default
案例,则在声明时初始化变量
monthString
。它还将删除编译时错误

这就是删除
default
关键字后出错的原因


谢谢

在声明时使用默认值初始化变量,然后再使用它来避免上述情况,这是一种很好的做法。很好的解释Eran@Victor我不同意。明确赋值是为了确保所有代码路径都指定了您想要指定的值。最好只指定一次要指定的值;立即赋值(或者重写)会减少编译器对代码正确性的一层检查。