java switch case无法解析为变量

时间:2015-05-20 08:59:53

标签: java switch-statement

我有一个简单的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

9 个答案:

答案 0 :(得分:1)

不,你不需要一个二传手。只需初始化变量:int b = 0;

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如异常所述,如果您的交换机应运行其default案例,则不要通过为其分配值来初始化 b。

int b;声明它。

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

即可

答案 3 :(得分:0)

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

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

之后,你返回b。 但是,由于b是局部变量,因此它没有默认值。您需要为所有可能性初始化它,包括默认值:

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

或者给b一个声明值:

int b = 0;

答案 4 :(得分:0)

return b点,b应初始化。如果a456,则会对其进行初始化。但如果a28怎么办?你说它不应该发生,但不应该发生的事情一直发生,编译器喜欢覆盖它的所有基础。

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

另一种可能性(我实际上最喜欢)是确保您的代码在默认情况下无法达到return;你可以在那里抛出异常(可能IllegalStateException,“代码有问题!”)然后编译器会知道它无法通过return到达default,而不是抱怨b未分配。当你的假设被违反时,你的代码不应该高兴地进行,所以这很合适。

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;
}

在这种特定情况下,实际上,您甚至可以将b排除在switch之外,并完全避免此问题。此外,最后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();
}

答案 5 :(得分:0)

当您声明值或b块时,您需要为default分配一个值。

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

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
    }
}

答案 6 :(得分:0)

Java编译器不知道a只能是4到6,所以它考虑了默认情况的可能性。因此,如果采用交换机的默认情况,则执行return b时从未初始化b。

答案 7 :(得分:0)

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

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

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

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

答案 8 :(得分:0)

更改此行: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;
}