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

导致java:240的Switch语句(可能尚未初始化),java,switch-statement,default,Java,Switch Statement,Default,我试图根据输入在变量中存储一个值: 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,

我试图根据输入在变量中存储一个值:

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;
    }
如果输入为“Y”或“Y”,我希望变量topping1存储值1,如果输入为“N”或“N”,则存储值0

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

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


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

如果
pepperoni
不是
Y
Y
N
N
,则您永远不会将值分配给
topping1
,因为
默认值
案例从不分配值。例如,如果
pearoni
不是这四个值中的一个,那么控制流将跳过其他两种情况,进入
default
,它从不给
topping1
一个值,因此稍后当您尝试使用它时,可能
topping1
从未收到一个值

“解决方法”是纠正逻辑,以便在未为其赋值的情况下,永远不要尝试使用
topping1
。你怎么做取决于你没有告诉我们的逻辑。例如,您可以为其分配除
0
1
以外的值(您在
开关的其他分支中分配的值)。

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

您可以执行的操作:将
topping1
初始化为无效值(例如,-1)。然后将case语句放入
while
循环中,该循环检查
topping1
的值是否仍然等于-1

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

  • 您已经初始化了
    topping1
    ,因此不会产生编译器错误
  • 您有一个有效的
    topping1

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

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

    这是可行的(同样适用于交换机):

    这是有效的:

    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。

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

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

    开关不是一个循环…很抱歉,错误应该是:243:错误:变量topping1可能没有初始化原因是我有四个不同的topping,所以每个topping的错误基本相同,但是如果我知道如何修复一个,那么每个错误都会被修复!什么类型的
    topping1
    ?很可能您只需要在声明时为它指定一个默认值(例如0),或者在
    default
    的情况下将它设置为某个值,以确保Java有一个值。好的,我为它指定了值0,现在它就可以工作了!非常感谢大家的帮助!如果我的答案有帮助,你为什么要取消检查?
    int a;
    if (condition()) {
      a=0;
    } 
    System.out.println(a); // compiler error!
    
    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;
    }