为什么在if语句中初始化字符串似乎与switch语句不同?

时间:2019-01-04 03:21:31

标签: java string if-statement switch-statement

我正在学习Java,并且正在根据一些书籍示例,通过简单的程序来查找一个月的季节。这两个类演示了两种测试值的方法:if / else if语句和switch语句。我感到困惑的是用于保存季节的字符串。当我将其声明为String season;时,它将与if语句一起使用。但是使用switch语句,这样做会产生“本地变量季节可能尚未初始化”错误。

public class IfElse {
    public static void main(String args[]) {
        int month = 5;
        String season;
            // isn't initialized, works fine

        if(month == 12 || month == 1 || month == 2)
            season = "Winter";
        else if(month == 3 || month == 4 || month == 5)
            season = "Spring";
        else if(month == 6 || month == 7 || month == 8)
            season = "Summer";
        else
            season = "Fall";

        // this is okay
        System.out.println("May is a " + season + " month.");
    }
}

在声明的同时,不要在初始化上面的代码的同时初始化season,但是如果以相同的方式声明,则在最后一个println()的switch的season变量会产生错误。

以下代码不起作用:

public class Switch {
    public static void main(String args[]) {
        int month = 5;
        String season;
            // HAS to be initialized, currently causes error
        switch(month) {
        case(12):
        case(1):
        case(2): 
            season = "Winter";
            break;
        case(3):
        case(4):
        case(5): 
            season = "Spring";
            break;
        case(6):
        case(7):
        case(8): 
            season = "Summer";
            break;
        case(9):
        case(10):
        case(11): 
            season = "Fall";
            break;

        default:
            System.out.println("Invalid month");
            break;
        }
        System.out.println("May is a " + season + " month");
    }             // produces an error if season isn't initialized to null or ""
}

是什么原因造成的?是括住switch语句的花括号,还是switch语句本身存在问题?在if语句中初始化字符串与在switch语句中初始化字符串有何不同?我似乎无法理解这一点。

很抱歉,如果这非常明显,或者它似乎是一个愚蠢的问题。

4 个答案:

答案 0 :(得分:45)

那是因为您没有指定默认情况下必须选择的季节。如果月份不在1到12之间,会发生什么? season将不会初始化。

如果您只希望输入1到12,那么您可能需要考虑在Exception中投掷default:

default:
    throw new IllegalArgumentException("Invalid month");

答案 1 :(得分:9)

在您的第一个示例中,没有代码无法为“季节”分配值的路径。在第二个示例中,默认情况下未分配值,因此可以使用未初始化的值执行最后一次打印(“可能是...”)。

答案 2 :(得分:6)

在您的if / else代码中,可以确保变量season将获得一个值。也就是说,else语句。

您的switch代码没有它。看看如果给定的月份值为season,变量13会发生什么-它不会得到值,并且将保持未初始化状态。

答案 3 :(得分:4)

您应该使用此

public class Switch {
public static void main(String args[]) {
    int month = 5;
    String season;
        // HAS to be initialized, currently causes error
    switch(month) {
    case 12:
    case 1:
    case 2: 
        season = "Winter";
        break;
    case 3:
    case 4:
    case 5: 
        season = "Spring";
        break;
    case 6 :
    case 7 :
    case 8 : 
        season = "Summer";
        break;
    case 9 :
    case 10 :
    case 11 : 
        season = "Fall";
        break;

    default:
        season = "Invalid";
        break;
    }
    System.out.println("May is a " + season + " month");
}             // produces an error if season isn't initialized to null or ""
}