为什么我不能在Java中的开关内初始化变量?

时间:2016-02-16 05:27:43

标签: java initialization switch-statement

我只是编程的初学者,所以我无法找到解决这个问题的方法。现有的问题似乎是用其他语言,或者是我的头脑。

我正在尝试编写一个小程序,用于返回任何给定日期输入的特定日期日。

{{1}}

编译这会给我一个错误,指出"变量月份可能尚未初始化",同时指向"月"在println语句中。任何一个案例中的初始化是无效的还是什么?我在交换机外面声明了月份变量...

7 个答案:

答案 0 :(得分:10)

与其他回复相反,您无需在声明时初始化textmonth

问题在于,如果default不是文字值,则执行将落到0情况,其中月份未初始化。

您可以将其初始化为无效值,例如default中的rubygems/gems/sass-3.x.x/lib/sass/tree/visitors/to_css.rb,但也许更好的选择是提供错误消息并中止执行。

答案 1 :(得分:6)

当您声明month时,您应该为其指定一个默认值(例如0或-1),否则JVM无法验证是否将为所有程序路径定义month印刷声明。

在这种情况下,如果输入了无效的month值,那么print语句会输出什么? Java无法分辨。 Java要么需要每个变量的默认值,要么需要能够确保每个可能的程序路径都为变量赋值。

因此,您可以将month设置为int month(默认值),或者在default语句中为switch个案例赋值(占所有程序路径)。这样,无论程序采用何种路径,month在您尝试打印时都会有一个值。

您可能希望查看的另一个选项是在发出无效月份时抛出错误并终止程序。由于您没有循环输入,因此单个无效输入也会导致输出无效。在这种情况下,最好向用户发出他/她输入错误的信号,并强制他们重新开始,而不是允许他们的错误传递到输出。

答案 2 :(得分:1)

尝试初始化月份

int month=0;

答案 3 :(得分:1)

您需要保证在运行时无论textmont具有哪个值,month都会得到一个值,现在再看一下该开关..

switch(textmonth) {
        case ("january"):
            month = 1;
            break;
...     

        case ("december"):
            month = 12;
            break;
        default:   //-< HERE is the point....
            System.out.println("The month you input was invalid");
        }

... 并且看到default案例没有赋值变量month ..

然后如果发生这种情况,月份将没有初始值...在那里添加正确的作业,并像之前的其他评论一样,声明并初始化变量,

答案 4 :(得分:1)

问题是int是一个基本类型,所有基元类型在运行时没有给出默认值,因此在尝试修改int而不初始化时会出现此错误,与引用类型不同,而Java给它提供了它默认值。

正如您在default案例中看到的那样,您没有初始化int变量month因此编译器可能会switch case将转到default。如果在case switch之后使用月份变量,那么就会发生这种情况,因为它没有任何默认值,因此编译错误。

实际上,如果你点month =0;或在默认情况下分配任何值,它将编译好。

你可以阅读更多: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html 和: Java: Why am I required to initialize a primitive local variable?

答案 5 :(得分:0)

与实例变量不同,如果未显式初始化,它们不会获得默认值,因此必须初始化局部变量。现在你有两个选择

  
      
  1. 初始化时声明它或

  2.   
  3. 在所有可能的条件下声明

  4.   

答案 6 :(得分:0)

使用此更新您的月份声明。

int month = 0;

如果在可能仅有条件执行的语句中完成初始化,则抛出此错误。 或者,如果您添加一个default语句,该语句也会为month赋值,则编译正常。