导致 java:240 的 switch 语句(可能尚未初始化)

Posted

技术标签:

【中文标题】导致 java:240 的 switch 语句(可能尚未初始化)【英文标题】:Switch statement resulting in java:240 (might not have been initialized) 【发布时间】:2013-02-28 23:23:59 【问题描述】:

我正在尝试根据输入将值存储在变量中:

switch(pepperoni) 

    case 'Y':
    case 'y':
        topping1 = 1;
        break;

    case 'N':
    case 'n':   
        topping1 = 0;
        break;

    default: 

        
    System.out.print("This is not a valid response, please try again \n");  
    System.out.print("Do you want Pepperoni? (Y/N): ");
    pepperoni = scan.next().charAt(0);
        break;
    

我希望变量 topping1 如果输入是 'Y' 或 'y' 则存储值 1,如果输入是 'N' 或 'n' 则存储值 0

如果输入既不是“Y”、“y”、“N”也不是“n”,那么我希望它重复问题,直到输入有效的输入。

当我稍后在程序中尝试打印值“因为它可能尚未初始化”时,问题就出现了,这在某种程度上是有道理的。 (下例)

if(topping1 > 0)
    System.out.println("Pepperoni"); 

// 243: error: variable topping1 might not have been initialized

我确实意识到还有其他方法可以做到这一点,但由于我真的很想学习 Java,所以我尝试尽可能多地了解基础知识。因此,如果有人能告诉我为什么这不起作用以及是否有办法通过 switch 语句或快速修复来做到这一点,我会非常高兴。

【问题讨论】:

开关不是循环... 很抱歉,错误应该是:243:错误:变量topping1可能没有被初始化原因是我有四个不同的topping,所以每个topping基本上都是一样的错误,但如果我知道如何修复一个,那么每个错误都会得到修复! topping1 是什么类型?很可能您只需要在声明时为其分配一个默认值(例如 0)或将其设置为 default 案例中的某个值,以确保 Java 它具有一个值。 【参考方案1】:

问题可能是 switch 语句不保证为 topping1 设置值。如果您收到“L”的响应,则不会将其设置为 1 或 0。您应该在初始化 topping1 时设置默认值或在默认子句中设置一个。

Java 的编译器无法分析您的代码以知道在设置之前您不会让人们退出循环(我认为这是其中的一部分)。它只能说有一条通过代码的路径允许它不被设置。

这行得通(开关也是如此):

int a;
if (condition()) 
  a=0;
 else 
  a=1;

System.out.println(a);

这很有效:

int a=1;
if (condition()) 
  a=0;
 
System.out.println(a);

这不是:

int a;
if (condition()) 
  a=0;
 
System.out.println(a); // compiler error!

因为如果 condition() 返回 false,a 是未定义的。必须定义局部变量。请注意,这与自动分配默认值 null、0 或 false 的类上的字段不同。

【讨论】:

如果我的回答有帮助,你为什么取消选中它?【参考方案2】:

如果pepperoni 不是YyNn,则永远不要为topping1 赋值,因为default 的情况永远不会为它赋值。例如,如果pepperoni 不是这四个值之一,那么控制流会跳过其他两种情况并转到default,它永远不会给topping1 一个值,所以稍后当你尝试使用它时,它是topping1 可能从未收到过任何值。

“解决方法”是更正逻辑,这样您就永远不会尝试使用 topping1 而不给它分配一个值。 如何你这样做取决于你没有向我们展示的逻辑。例如,您可以为它分配一个不同于01 的值(您在switch 的其他分支中分配的值)。

【讨论】:

好的,我为它分配了值 0,所以现在它可以工作了!非常感谢大家的帮助!【参考方案3】:

您收到“可能尚未初始化”错误,因为您的 switch 语句中有一条路径未初始化 topping1 并且您稍后引用了该变量。

您可以做什么:将topping1 初始化为无效值(例如,-1)。然后将你的 case 语句放在一个 while 循环中,检查 topping1 的值是否仍然等于 -1。

然后,一旦你退出 while 循环,你就会知道以下情况是正确的:

    您已经初始化了topping1,因此不会出现编译错误。 topping1 的值有效。

【讨论】:

【参考方案4】:

这看起来有点难看,但这样编写循环是阻止编译器抱怨的一种方法:

for (;;) 
    System.out.print("Do you want Pepperoni? (Y/N): ");
    pepperoni = scan.next().charAt(0);
    switch (pepperoni) 

        case 'Y':
        case 'y':
            topping1 = 1;
            break;

        case 'N':
        case 'n':   
            topping1 = 0;
            break;

        default: 
            System.out.println("This is not a valid response, please try again");
            continue;
    
    break;

【讨论】:

以上是关于导致 java:240 的 switch 语句(可能尚未初始化)的主要内容,如果未能解决你的问题,请参考以下文章

导致此问题的原因:无法从 switch 语句跳转到此案例标签 [重复]

一些语句(switch case...)

如何在准备中的 switch 语句中使用可选绑定(segue :)

switch语句中 参数的类型

Switch case 语句怎么使用

c语言switch语句中default是啥意思?