简化代码时Java切换错误

标签 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,我认为它们都是同一件事。有人可以向我解释一下有什么区别以及为什么第一个不起作用吗?

最佳答案

代码可能看起来相似,但区别如下:

在第二个示例中,在设置 maxplayer 之后直接调用 print 函数,因此在读取变量时,保证会设置它。

但是在第一个示例中,不能保证开关进入任何情况,因此当到达 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
}

请记住,您的 switch 中应该始终有一个 default case!请参阅以下很好的解释,了解为什么 default 情况很重要:https://stackoverflow.com/a/5241196/1174343

关于简化代码时Java切换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32023926/

相关文章:

java - SAF(Storage Access Framework) 是否解决了 Android 4.4 (KitKat) 中的 SD 卡 WRITE 问题?

c# - '||' switch 语句中两个枚举之间使用的运算符

java - 将switch语句放入循环java中

java - 如何指定由通配符包围的 JPA 命名参数?

java - 在 JavaFX 对话框中获取两个以上的输入

Java 同步未按预期工作

java - 反编译后$SwitchMap$错误

java - 以下情况的替代方案

swift - 错误: Expression pattern of type 'CountableClosedRange<Int>' cannot match values of type 'UITextField!'

Javascriptexecutor 可以检测到吗?