为什么我的交换机块中的"变量可能没有被初始化"编译器错误?

Dam*_*son 3 java variables switch-statement

使用switch block时遇到"变量可能未初始化"错误.

这是我的代码:

public static void foo(int month)
{
    String monthString;
    switch (month)
    {
        case 1: monthString = "January";
                break;
        case 2: monthString = "February";
                break;
    }
    System.out.println(monthString);
}
Run Code Online (Sandbox Code Playgroud)

错误:

Switch.java:17: error: variable monthString might not have been initialized
        System.out.println (monthString);
Run Code Online (Sandbox Code Playgroud)

据我所知,当您尝试访问尚未初始化的变量时会发生此错误,但是当我在交换机块中为其分配值时,我是否正在初始化它?

同样,即使月份是编译时常量,我仍然会收到相同的错误:

public static void foo()
{
    int month = 2;
    String monthString;
    switch (month)
    {
        case 1: monthString = "January";
                break;
        case 2: monthString = "February";
                break;
    }
    System.out.println(monthString);
}
Run Code Online (Sandbox Code Playgroud)

rge*_*man 8

如果month不是1,2则执行路径中没有语句在monthString引用之前初始化.编译器不会假设month变量保留其2值,即使monthfinal.

JLS,第16章,关于"明确赋值"的谈判,并在其下一个变量可以是条件,它引用之前"明确赋值".

除了条件布尔运算符&&,||和?的特殊处理之外 :和布尔值常量表达式一样,在流分析中不考虑表达式的值.

monthString在引用之前,该变量未明确赋值.

switch块之前初始化它.

String monthString = "unrecognized month";
Run Code Online (Sandbox Code Playgroud)

或者defaultswitch语句中的情况下初始化它.

default:
    monthString = "unrecognized month";
Run Code Online (Sandbox Code Playgroud)

或抛出异常

default:
    throw new RuntimeExpception("unrecognized month " + month);
Run Code Online (Sandbox Code Playgroud)