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

达姆·理查森(Damhan Richardson)

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

这是我的代码:

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);
}
格特曼

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

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

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

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

switch之前对其进行初始化

String monthString = "unrecognized month";

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

default:
    monthString = "unrecognized month";

或抛出异常

default:
    throw new RuntimeExpception("unrecognized month " + month);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

编译器错误“变量x可能尚未初始化”的含义是什么?

为什么会出现“本地变量可能尚未初始化”的错误?

编译器说变量尚未初始化

为什么编译器说如果要求变量在循环中通过才可能不初始化变量?

catch块中的throw语句如何防止未初始化变量的编译器错误?

为什么在循环中初始化数组时Rust编译器为什么会给出未初始化的变量错误?

Visual Studio生成“错误:未初始化的本地变量'x'”,而在线编译器不生成-为什么?

为什么此代码不断返回“变量可能尚未初始化”错误?

为什么不断告诉我“变量卡可能尚未初始化”

变量可能尚未初始化错误

变量可能尚未初始化?错误

为什么编译器禁止初始化数组?

为什么Java编译器不理解此变量总是初始化的?

为什么编译器将此变量初始化为错误的值?这是对齐问题吗?

为什么在我的数组初始化中出现“字段元素”错误?

为什么Kotlin编译器不强迫我初始化接口中定义的val?

Java中未初始化的类成员不会发出任何编译器错误。但是局部变量可以。为什么?

为什么即使我已分配了未初始化的变量的每个字段,编译器仍会对其发出警告?

不可变类中的编译时错误:(最终)变量可能尚未初始化

如何避免Java编译错误“局部变量可能尚未初始化”?(是的,很认真!)

为什么当将 void 传递给 int 数组时它不起作用我的编译器说“错误:初始化程序无效”

为什么编译器报告“可能在此函数中未初始化使用”?

使用 BigInteger 出现错误“变量veryFar 可能尚未初始化”

为什么零初始化不是c ++中未初始化变量的默认值?有编译器选项可以强制执行吗?

为什么C和C ++编译器将显式初始化和默认初始化的全局变量放在不同的段中?

为什么编译器将带有方括号()的数组初始化标记为错误?

对TypeScript使用@Prop装饰器-编译器出现错误要求初始化prop

为什么这段代码说明变量j可能尚未初始化?它正在循环内初始化

为什么我收到“未初始化的变量”错误