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