Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么在if语句中初始化字符串与在switch语句中初始化字符串不同?_Java_String_If Statement_Switch Statement - Fatal编程技术网

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

Java 为什么在if语句中初始化字符串与在switch语句中初始化字符串不同?,java,string,if-statement,switch-statement,Java,String,If Statement,Switch Statement,我在学习Java,并且根据一些书中的例子,编写一些简单的程序来查找一个月的季节。这两个类演示了两种测试值的方法:if/elseif语句和switch语句。我搞不懂的是用来支撑这个季节的绳子。当我声明它只是字符串季节它与if语句一起工作。但对于switch语句,这样做会产生“局部变量季节可能尚未初始化”错误 对于上述代码,不在声明的同时初始化季节可以正常工作,但是如果以相同的方式声明,则开关的最后一个println()中的季节变量会产生错误 以下代码不起作用: public class Switc

我在学习Java,并且根据一些书中的例子,编写一些简单的程序来查找一个月的季节。这两个类演示了两种测试值的方法:if/elseif语句和switch语句。我搞不懂的是用来支撑这个季节的绳子。当我声明它只是
字符串季节它与if语句一起工作。但对于switch语句,这样做会产生“局部变量季节可能尚未初始化”错误

对于上述代码,不在声明的同时初始化季节可以正常工作,但是如果以相同的方式声明,则开关的最后一个
println()
中的季节变量会产生错误

以下代码不起作用:

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语句中初始化字符串有何不同?我就是不明白这一点


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

这是因为您没有指定默认情况下的季节。如果月份不在1-12之内,会发生什么情况<代码>季节
将不会初始化

如果您只期望1-12个月的输入,那么您可能需要考虑在<代码>默认:< < /Cord>< /P>中抛出<代码>异常<代码> >

default:
    throw new IllegalArgumentException("Invalid month");
你应该用这个

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

if
/
else
代码中,可以保证变量
seasure
将获得一个值。即
else
语句


您的
开关
代码没有该开关。查看变量
seasure
如果月份的给定值为
13
,它将不会得到值,并且将保持未初始化状态。

在第一个示例中,代码中没有路径无法为“seasure”赋值。在第二个示例中,默认情况下不指定值,因此最后一次打印(“May is…”)可以使用未初始化的值执行。

为了指出问题中的一个小错误,询问if/else实现,else会将任何无效月份设置为
Fall
。如果month设置为42,它将打印
Fall
@DrZoo您完全正确。我这样做是出于懒惰,因为我知道我永远不会将月份值设置为超出范围,但这也意味着永远不会出现季节未初始化的情况。将else更改为else if也会导致与switch语句中相同的错误。所以我现在意识到我的问题是变量何时(或何时)被赋予一个值。@jkofskie我不想像现在听起来的那样刻薄,但问题是你假设这个值永远不会超过12。永远不要在编程中假设任何东西,当你开始假设某些东西(特别是用户输入)时,你会遇到问题(在这种情况下,编译器会很好地警告你)。@KamiKaze一些假设是有用的。如果您确实知道输入值保证在可接受的范围内,那么就不必添加一个guard子句。针对您知道不会出现的情况进行防御可能会导致难以理解的复杂代码。这里的要点是,程序员应该小心地将程序员对程序的了解与编译器知道的或应该知道的区分开来。是的,出于某种原因,我下意识地认为,只有当月份的值实际上超出定义的范围时,这才是一个问题,但是我忘了Java不是那样工作的。在不工作的代码中,哪一季是第13个月?关于这个问题。仅供参考,案例值周围不需要括号<代码>案例12:etc很好。顺便说一句,使用未初始化的变量是一个好主意,因为这样可以清楚地表明您是否考虑了所有路径(但示例显示您可能没有正确考虑它)。(与使用
String seasure=“”;
相反,后者通常出现在经验较少的程序员的代码中),我认为即将出现的case表达式将使这一体验变得更好:这与
if
switch
无关。您的两段代码根本不是等价的,但您可以使用
if
switch
编写等价的代码(显示任一行为)。
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 ""
}