java switch case 无法解析为变量
java switch case can not resolve to variable
我有一个简单的 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
?
是的,你没有初始化 b
。根据您的要求设置一些默认值,例如 int b=-1;
不,你不需要 setter。只需初始化变量:int b = 0;
如例外情况所述,如果您的开关应该 运行 它的 default
情况,您永远不会通过为它分配一个值来 初始化 b。
int b;
只是 声明 它。
要解决您的问题,只需将其更改为 int b = 0;
JVM 将查看所有可能的结果。
其中之一是:
default:
System.out.println("wrong"); // even though it is impossible!
break;
之后,你 return b。
但是,由于 b 是一个局部变量,它没有默认值。你需要为所有的可能性初始化它,包括默认的:
default:
System.out.println("wrong"); // even though it is impossible!
b = 0;
break;
或者在声明时给b一个值:
int b = 0;
在return b
点,b
应该被初始化。如果 a
是 4
、5
和 6
,它将被初始化;但是如果 a
是 28
呢?你说它不应该发生,但不应该发生的事情总是发生,编译器喜欢涵盖所有基础。
要么在顶部初始化 b
以涵盖所有情况,要么确保在 switch
(包括 default
)的每个分支中分配它。
另一种可能性(我其实最喜欢)是确保你的代码在默认情况下不能达到return
;你可以在那里抛出一个异常(可能是 IllegalStateException
、"there is something wrong with the code!")然后编译器就会知道它无法通过 default
到达 return
,而不是抱怨 [=13] =] 未分配。当你的假设被违反时,你的代码不应该愉快地继续,所以这很合适。
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;
}
在这种特定情况下,实际上,您甚至可以在 switch
之外分解出 b
并完全避免该问题。另外,最后一个 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();
}
您需要在声明时或在 default
块中为 b
赋值。
实例字段在声明时具有隐式默认值,但方法中的变量没有。
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
}
}
Java编译器不知道a只能是4到6,所以考虑了default case的可能性。因此,如果采用 switch 的默认情况,那么,当您执行 return b
.
时,b 从未被初始化
switch
中的案例有可能没有被执行,如果是这种情况,它将进入 default
块。在 default
块中,您没有设置 b
的值。你一开始就没有初始化 b
。这就是为什么会发生这种情况。
要避免这种情况,您可以执行以下操作之一:
int b = -1; // Initialize b
2.
default: {
System.out.println("wrong"); // even though it is impossible!
b = -1;
break;
}
要么更改此行: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;
}
我有一个简单的 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
?
是的,你没有初始化 b
。根据您的要求设置一些默认值,例如 int b=-1;
不,你不需要 setter。只需初始化变量:int b = 0;
如例外情况所述,如果您的开关应该 运行 它的 default
情况,您永远不会通过为它分配一个值来 初始化 b。
int b;
只是 声明 它。
要解决您的问题,只需将其更改为 int b = 0;
JVM 将查看所有可能的结果。 其中之一是:
default:
System.out.println("wrong"); // even though it is impossible!
break;
之后,你 return b。 但是,由于 b 是一个局部变量,它没有默认值。你需要为所有的可能性初始化它,包括默认的:
default:
System.out.println("wrong"); // even though it is impossible!
b = 0;
break;
或者在声明时给b一个值:
int b = 0;
在return b
点,b
应该被初始化。如果 a
是 4
、5
和 6
,它将被初始化;但是如果 a
是 28
呢?你说它不应该发生,但不应该发生的事情总是发生,编译器喜欢涵盖所有基础。
要么在顶部初始化 b
以涵盖所有情况,要么确保在 switch
(包括 default
)的每个分支中分配它。
另一种可能性(我其实最喜欢)是确保你的代码在默认情况下不能达到return
;你可以在那里抛出一个异常(可能是 IllegalStateException
、"there is something wrong with the code!")然后编译器就会知道它无法通过 default
到达 return
,而不是抱怨 [=13] =] 未分配。当你的假设被违反时,你的代码不应该愉快地继续,所以这很合适。
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;
}
在这种特定情况下,实际上,您甚至可以在 switch
之外分解出 b
并完全避免该问题。另外,最后一个 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();
}
您需要在声明时或在 default
块中为 b
赋值。
实例字段在声明时具有隐式默认值,但方法中的变量没有。
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
}
}
Java编译器不知道a只能是4到6,所以考虑了default case的可能性。因此,如果采用 switch 的默认情况,那么,当您执行 return b
.
switch
中的案例有可能没有被执行,如果是这种情况,它将进入 default
块。在 default
块中,您没有设置 b
的值。你一开始就没有初始化 b
。这就是为什么会发生这种情况。
要避免这种情况,您可以执行以下操作之一:
int b = -1; // Initialize b
2.
default: {
System.out.println("wrong"); // even though it is impossible!
b = -1;
break;
}
要么更改此行: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;
}