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

阅读