0

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

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”,那么我希望它重复这个问题,直到输入有效的输入。

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

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

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

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

4

4 回答 4

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!

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

于 2013-02-28T23:37:03.777 回答
0

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

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;
}
于 2013-02-28T23:46:22.593 回答
0

If pepperoniis not Y, y, N, or n,你永远不会给 赋值topping1,因为defaultcase 永远不会给它赋值。例如,如果pepperoni不是这四个值之一,则控制流会跳过其他两种情况并转到default,它永远不会给出topping1值,因此稍后当您尝试使用它时,可能topping1根本没有收到值。

“解决方法”是更正逻辑,以便您在没有为其topping1分配值的情况下永远不会尝试使用。你如何做到这一点取决于你没有向我们展示的逻辑。例如,您可以为它分配除0or以外1的值(您在 的其他分支中分配的值switch)。

于 2013-02-28T23:32:05.270 回答
0

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

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

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

  1. 您已初始化topping1,因此不会导致编译器错误。
  2. 你有一个有效的值topping1
于 2013-02-28T23:34:29.207 回答