java switch case 无法解析为变量

java switch case can not resolve to variable

我有一个简单的 switch case 案例。

public static int setMapTile() {

    int a = getArmadaLength(); // 4 to 6 
    int b;
    switch (a) {

        case 4:
            System.out.println(" recommended MapSize : 10 x 10");
            b = setSize();// method for bigger map, return int

            break;
        case 5:
            System.out.println(" recommended MapSize : 11 x 11");
            b = setSize();// method for bigger map, return int

            break;
        case 6:
            System.out.println(" recommended MapSize : 12 x 12");
            b = setSize();// method for bigger map, return int

            break;            
        default:
            System.out.println("wrong"); // even though it is impossible!
            break;
    }

    return b;
}

它说 b 可能还没有初始化。我是否必须使用 setter & getter 将所选值分配给 b

是的,你没有初始化 b。根据您的要求设置一些默认值,例如 int b=-1;

不,你不需要 setter。只需初始化变量:int b = 0;

如例外情况所述,如果您的开关应该 运行 它的 default 情况,您永远不会通过为它分配一个值来 初始化 b。

int b; 只是 声明 它。

要解决您的问题,只需将其更改为 int b = 0;

JVM 将查看所有可能的结果。 其中之一是:

default:
            System.out.println("wrong"); // even though it is impossible!
            break;

之后,你 return b。 但是,由于 b 是一个局部变量,它没有默认值。你需要为所有的可能性初始化它,包括默认的:

default:
            System.out.println("wrong"); // even though it is impossible!
            b = 0;
            break;

或者在声明时给b一个值:

int b = 0;

return b点,b应该被初始化。如果 a456,它将被初始化;但是如果 a28 呢?你说它不应该发生,但不应该发生的事情总是发生,编译器喜欢涵盖所有基础。

要么在顶部初始化 b 以涵盖所有情况,要么确保在 switch(包括 default)的每个分支中分配它。

另一种可能性(我其实最喜欢)是确保你的代码在默认情况下不能达到return;你可以在那里抛出一个异常(可能是 IllegalStateException、"there is something wrong with the code!")然后编译器就会知道它无法通过 default 到达 return,而不是抱怨 [=13] =] 未分配。当你的假设被违反时,你的代码不应该愉快地继续,所以这很合适。

public static int setMapTile() {
    int a = getArmadaLength(); // 4 to 6 
    int b;
    switch (a) {
        case 4:
            System.out.println(" recommended MapSize : 10 x 10");
            b = setSize();// method for bigger map, return int
            break;
        case 5:
            System.out.println(" recommended MapSize : 11 x 11");
            b = setSize();// method for bigger map, return int
            break;
        case 6:
            System.out.println(" recommended MapSize : 12 x 12");
            b = setSize();// method for bigger map, return int
            break;            
        default:
            throw new IllegalStateException("Armada length is " + a + "?!?");
            break;
    }
    return b;
}

在这种特定情况下,实际上,您甚至可以在 switch 之外分解出 b 并完全避免该问题。另外,最后一个 break 是多余的。

public static int setMapTile() {
    int a = getArmadaLength(); // 4 to 6 
    switch (a) {
        case 4:
            System.out.println(" recommended MapSize : 10 x 10");
            break;
        case 5:
            System.out.println(" recommended MapSize : 11 x 11");
            break;
        case 6:
            System.out.println(" recommended MapSize : 12 x 12");
            break;            
        default:
            throw new IllegalStateException("Armada length is " + a + "?!?");
    }
    return setSize();
}

您需要在声明时或在 default 块中为 b 赋值。

实例字段在声明时具有隐式默认值,但方法中的变量没有。

public class Foo {
    private int age; // this defaults to 0

    public void bar() {
        int height; // this won't compile unless you follow it with an assignment
    }
}

Java编译器不知道a只能是4到6,所以考虑了default case的可能性。因此,如果采用 switch 的默认情况,那么,当您执行 return b.

时,b 从未被初始化

switch 中的案例有可能没有被执行,如果是这种情况,它将进入 default 块。在 default 块中,您没有设置 b 的值。你一开始就没有初始化 b 。这就是为什么会发生这种情况。

要避免这种情况,您可以执行以下操作之一:

  1. int b = -1; // Initialize b

2.

default: {
            System.out.println("wrong"); // even though it is impossible!
            b = -1;
            break;
          }

要么更改此行:int b;int b = 0;

或者将您的代码更改为这个更短的变体:

public static int setMapTile() {

    int a = getArmadaLength(); // 4 to 6 
    switch (a) {

        case 4:
            System.out.println(" recommended MapSize : 10 x 10");
            return setSize();// method for bigger map, return int
        case 5:
            System.out.println(" recommended MapSize : 11 x 11");
            return setSize();// method for bigger map, return int
        case 6:
            System.out.println(" recommended MapSize : 12 x 12");
            return setSize();// method for bigger map, return int           
        default:
            System.out.println("wrong"); // even though it is impossible!
    }

    return 0;
}