Java 简化代码时切换错误
Java switch error when simplifying code
大家好,这是我的第一个 post 如果我有任何错误,请原谅我。
这是我的问题:
public class Main {
public static void main(String[] args) {
int onlineplayer = 0;
int maxplayer;
switch(onlineplayer) {
case 0:
maxplayer = 1;
break;
case 1:
maxplayer = 2;
break;
}
System.out.print(onlineplayer + "/" + maxplayer);
}
这行代码returns这个错误:
Main.java:13: error: variable maxplayer might not have been initialized
System.out.print(onlineplayer + "/" + maxplayer);
^
同时
public class Main {
public static void main(String[] args) {
int onlineplayer = 0;
int maxplayer;
switch(onlineplayer) {
case 0:
maxplayer = 1;
System.out.print(onlineplayer + "/" + maxplayer);
break;
case 1:
maxplayer = 2;
System.out.print(onlineplayer + "/" + maxplayer);
break;
}
}
这个有效。
我刚才说学习 Java,我认为它们是同一回事。谁能给我解释一下有什么区别,为什么第一个不起作用?
代码可能看起来相似,但区别如下:
在您的第二个示例中,print
函数在设置 maxplayer
后直接调用,因此在从变量读取时,它保证被设置。
但在您的第一个示例中,不能保证开关进入任何情况,因此当到达 print
行时,maxplayer
仍可能未初始化。
为了防止这种情况,您通常会添加一个 default
case,如果没有其他 case 匹配则执行该 case。这样可以保证 maxplayer
已设置:
switch(onlineplayer) {
case 0:
maxplayer = 1;
break;
case 1:
maxplayer = 2;
break;
default:
System.out.print("Some warning");
maxplayer = 1; // some default value
}
请记住,您的 switch 中应该始终有一个 default
外壳!看到这个很好的解释为什么 default
案例很重要:
因为编译器不够"smart"
在您的第一个代码片段中,如果 onlineplayer
的值不同于 0 或 1,则 maxplayer
将保持未初始化状态。
当然这实际上是不可能的,因为 onlineplayer
是用值 0 初始化的,没有其他线程可以修改它。但是编译器无法识别。
缺少 "smartness" 实际上是按照设计。 Java 语言规范有明确赋值的规则,您可以在 chapter 16
阅读
大家好,这是我的第一个 post 如果我有任何错误,请原谅我。 这是我的问题:
public class Main {
public static void main(String[] args) {
int onlineplayer = 0;
int maxplayer;
switch(onlineplayer) {
case 0:
maxplayer = 1;
break;
case 1:
maxplayer = 2;
break;
}
System.out.print(onlineplayer + "/" + maxplayer);
}
这行代码returns这个错误:
Main.java:13: error: variable maxplayer might not have been initialized
System.out.print(onlineplayer + "/" + maxplayer);
^
同时
public class Main {
public static void main(String[] args) {
int onlineplayer = 0;
int maxplayer;
switch(onlineplayer) {
case 0:
maxplayer = 1;
System.out.print(onlineplayer + "/" + maxplayer);
break;
case 1:
maxplayer = 2;
System.out.print(onlineplayer + "/" + maxplayer);
break;
}
}
这个有效。 我刚才说学习 Java,我认为它们是同一回事。谁能给我解释一下有什么区别,为什么第一个不起作用?
代码可能看起来相似,但区别如下:
在您的第二个示例中,print
函数在设置 maxplayer
后直接调用,因此在从变量读取时,它保证被设置。
但在您的第一个示例中,不能保证开关进入任何情况,因此当到达 print
行时,maxplayer
仍可能未初始化。
为了防止这种情况,您通常会添加一个 default
case,如果没有其他 case 匹配则执行该 case。这样可以保证 maxplayer
已设置:
switch(onlineplayer) {
case 0:
maxplayer = 1;
break;
case 1:
maxplayer = 2;
break;
default:
System.out.print("Some warning");
maxplayer = 1; // some default value
}
请记住,您的 switch 中应该始终有一个 default
外壳!看到这个很好的解释为什么 default
案例很重要:
因为编译器不够"smart"
在您的第一个代码片段中,如果 onlineplayer
的值不同于 0 或 1,则 maxplayer
将保持未初始化状态。
当然这实际上是不可能的,因为 onlineplayer
是用值 0 初始化的,没有其他线程可以修改它。但是编译器无法识别。
缺少 "smartness" 实际上是按照设计。 Java 语言规范有明确赋值的规则,您可以在 chapter 16
阅读