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

Arv*_*Arv 3 java initialization switch-statement

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

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

import java.util.*;

class bday {
public static void main(String[] args){

    Scanner yearfinder = new Scanner(System.in);
    System.out.println("Please type any year");
    int year = yearfinder.nextInt();

    Scanner monthfinder = new Scanner(System.in);
    System.out.println("Please type any month");
    String textmonth = monthfinder.nextLine();
    int month;

    switch(textmonth) {
        case ("january"):
            month = 1;
            break;
        case ("february"):
            month = 2;
            break;
        case ("march"):
            month = 3;
            break;
        case ("april"):
            month = 4;
            break;
        case ("may"):
            month = 5;
            break;
        case ("june"):
            month = 6;
            break;
        case ("july"):
            month = 7;
            break;
        case ("august"):
            month = 8;
            break;
        case ("september"):
            month = 9;
            break;
        case ("october"):
            month = 10;
            break;
        case ("november"):
            month = 11;
            break;
        case ("december"):
            month = 12;
            break;
        default:
            System.out.println("The month you input was invalid");
        }

    Scanner datefinder = new Scanner(System.in);
    System.out.println("Please type any day");
    int date = datefinder.nextInt();

    System.out.println("The date you gave was " + date + "/" + month + "/" + year);
}
}

    //Jan 1 1900 was a monday.
Run Code Online (Sandbox Code Playgroud)

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

Mis*_*ble 10

与其他回复相反,您无需month在声明时进行初始化.

问题是,如果textmonth不是文字值,则执行将落在default案例中,其中月份未初始化.

您可以将其初始化为无效值,例如,0在这种default情况下,但也许更好的选择是提供错误消息并中止执行.


Riv*_*ver 6

声明month时应该给它一个默认值(比如说0或-1),否则JVM无法验证是否month会为导致print语句的所有程序路径定义它.

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

因此,您可以将month值设置为int month(默认值),也可以defaultswitch语句中为其赋值(为所有程序路径计算).这样,无论程序采用何种路径,month当您尝试打印时都会有一个值.

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