小编典典

为什么在切换块中出现“变量可能尚未初始化”的编译器错误?

java

使用开关块时遇到“未初始化变量”错误。

这是我的代码:

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

错误:

Switch.java:17: error: variable monthString might not have been initialized
        System.out.println (monthString);

据我所知,当您尝试访问一个尚未初始化的变量时会发生此错误,但是当我在switch块中为其赋值时,是否没有初始化它?

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

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);
}

阅读 215

收藏
2020-09-16

共1个答案

小编典典

如果month不是12则执行路径中没有在monthString引用之前初始化的语句。即使is
,编译器也不会假定该month变量保留其2值。month``final

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

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

monthString在引用变量之前,未明确分配该变量。

switch块之前对其进行初始化。

String monthString = "unrecognized month";

defaultswitch语句中的情况下将其初始化。

default:
    monthString = "unrecognized month";

或抛出异常

default:
    throw new RuntimeExpception("unrecognized month " + month);
2020-09-16