我有一个简单的switch case
案例。
public static int setMapTile() {
int a = getArmadaLength(); // 4 to 6
int b;
switch (a) {
case 4:
System.out.println(" recommended MapSize : 10 x 10");
b = setSize();// method for bigger map, return int
break;
case 5:
System.out.println(" recommended MapSize : 11 x 11");
b = setSize();// method for bigger map, return int
break;
case 6:
System.out.println(" recommended MapSize : 12 x 12");
b = setSize();// method for bigger map, return int
break;
default:
System.out.println("wrong"); // even though it is impossible!
break;
}
return b;
}
它表示b
可能尚未初始化。我必须使用setter
& getter
将所选值分配给b
?
答案 0 :(得分:1)
不,你不需要一个二传手。只需初始化变量:int b = 0;
答案 1 :(得分:0)
是的,您没有初始化b
。根据您的要求设置一些默认值,例如int b=-1;
答案 2 :(得分:0)
如异常所述,如果您的交换机应运行其default
案例,则不要通过为其分配值来初始化 b。
int b;
仅声明它。
要解决您的问题,您只需将其更改为int b = 0;
答案 3 :(得分:0)
JVM将研究所有可能的结果。 其中之一是:
default:
System.out.println("wrong"); // even though it is impossible!
break;
之后,你返回b。 但是,由于b是局部变量,因此它没有默认值。您需要为所有可能性初始化它,包括默认值:
default:
System.out.println("wrong"); // even though it is impossible!
b = 0;
break;
或者给b一个声明值:
int b = 0;
答案 4 :(得分:0)
在return b
点,b
应初始化。如果a
为4
,5
和6
,则会对其进行初始化。但如果a
是28
怎么办?你说它不应该发生,但不应该发生的事情一直发生,编译器喜欢覆盖它的所有基础。
在顶部初始化b
以涵盖所有情况,或确保在switch
的每个分支(包括default
)中分配它。
另一种可能性(我实际上最喜欢)是确保您的代码在默认情况下无法达到return
;你可以在那里抛出异常(可能IllegalStateException
,“代码有问题!”)然后编译器会知道它无法通过return
到达default
,而不是抱怨b
未分配。当你的假设被违反时,你的代码不应该高兴地进行,所以这很合适。
public static int setMapTile() {
int a = getArmadaLength(); // 4 to 6
int b;
switch (a) {
case 4:
System.out.println(" recommended MapSize : 10 x 10");
b = setSize();// method for bigger map, return int
break;
case 5:
System.out.println(" recommended MapSize : 11 x 11");
b = setSize();// method for bigger map, return int
break;
case 6:
System.out.println(" recommended MapSize : 12 x 12");
b = setSize();// method for bigger map, return int
break;
default:
throw new IllegalStateException("Armada length is " + a + "?!?");
break;
}
return b;
}
在这种特定情况下,实际上,您甚至可以将b
排除在switch
之外,并完全避免此问题。此外,最后break
是多余的。
public static int setMapTile() {
int a = getArmadaLength(); // 4 to 6
switch (a) {
case 4:
System.out.println(" recommended MapSize : 10 x 10");
break;
case 5:
System.out.println(" recommended MapSize : 11 x 11");
break;
case 6:
System.out.println(" recommended MapSize : 12 x 12");
break;
default:
throw new IllegalStateException("Armada length is " + a + "?!?");
}
return setSize();
}
答案 5 :(得分:0)
当您声明值或b
块时,您需要为default
分配一个值。
实例字段在声明时具有隐式默认值,但方法中的变量不具有。
public class Foo {
private int age; // this defaults to 0
public void bar() {
int height; // this won't compile unless you follow it with an assignment
}
}
答案 6 :(得分:0)
Java编译器不知道a只能是4到6,所以它考虑了默认情况的可能性。因此,如果采用交换机的默认情况,则执行return b
时从未初始化b。
答案 7 :(得分:0)
switch
中的非案例有可能被执行,如果是这样,它将进入default
块。在default
块中,您未设置b
的值。你从来没有初始化b
。这就是为什么会发生这种情况。
要避免这种情况,您可以执行以下操作之一:
int b = -1; // Initialize b
2
default: {
System.out.println("wrong"); // even though it is impossible!
b = -1;
break;
}
答案 8 :(得分:0)
更改此行:int b;
至int b = 0;
或者将您的代码更改为这个较短的版本:
public static int setMapTile() {
int a = getArmadaLength(); // 4 to 6
switch (a) {
case 4:
System.out.println(" recommended MapSize : 10 x 10");
return setSize();// method for bigger map, return int
case 5:
System.out.println(" recommended MapSize : 11 x 11");
return setSize();// method for bigger map, return int
case 6:
System.out.println(" recommended MapSize : 12 x 12");
return setSize();// method for bigger map, return int
default:
System.out.println("wrong"); // even though it is impossible!
}
return 0;
}