简化代码时出现Java切换错误

时间:2015-08-15 10:42:12

标签: java switch-statement

大家好,这是我的第一篇文章,如果我犯了任何错误,请原谅我。 这是我的问题:

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,我认为它们都是一样的。有人可以向我解释有什么不同,为什么第一个不起作用?

2 个答案:

答案 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

阅读