大家好,这是我的第一篇文章,如果我犯了任何错误,请原谅我。 这是我的问题:
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);
}
这行代码返回此错误:
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,我认为它们都是一样的。有人可以向我解释有什么不同,为什么第一个不起作用?
答案 0 :(得分:3)
代码可能看起来很相似,但不同之处如下:
在第二个示例中,print
函数在设置maxplayer
后直接调用,因此在从变量读取时,保证设置它。
但在第一个示例中,无法保证切换输入任何情况,因此当到达print
行时,maxplayer
仍可能未初始化。
为了防止这种情况,您通常会添加一个default
案例,如果没有其他案例匹配则会执行。这样可以保证设置maxplayer
:
switch(onlineplayer) {
case 0:
maxplayer = 1;
break;
case 1:
maxplayer = 2;
break;
default:
System.out.print("Some warning");
maxplayer = 1; // some default value
}
请记住,您的交换机应始终有default
个案例!请参阅default
案例重要原因的良好解释:https://stackoverflow.com/a/5241196/1174343
答案 1 :(得分:2)
因为编纂者不够“聪明”。
如果onlineplayer
的值不等于0或1,则在您的第一段代码中,maxplayer
将保持未初始化状态。
当然,这实际上是不可能的,因为onlineplayer
初始化为值0,并且没有其他线程可以修改它。但是编译器无法识别它。
缺乏“聪明”实际上是根据dessign。 Java语言规范具有明确赋值的规则,您可以在chapter 16
阅读