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

Why can't I initialize a variable inside a switch in Java?

我只是编程的初学者,所以我找不到解决这个问题的方法。现有的问题似乎要么是用其他语言,要么是在我的脑海中。

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

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.

编译它给我一个错误,指出 "variable month may not have been initialized",同时在 println 语句中指向 "month"。任何情况下的初始化是否无效?我在开关外声明了月份变量...

当你声明 month 时,你应该给它一个默认值(比如 0 或 -1),否则 JVM 无法验证 month 将被定义为所有程序路径导致打印语句。

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

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

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

尝试初始化月份

int month=0;

与其他回复相反,您不需要在声明时初始化month

问题是,如果 textmonth 是字面值的 none,执行将落入 default 的情况,其中月份不会被初始化。

您可以将其初始化为无效值,例如 default 中的 0,但也许更好的选择是给出错误消息并中止执行。

以此更新您的月份声明。

int month = 0;

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

你需要保证在运行的时候无论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..

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

问题是 int 是基本类型,所有基本类型在运行时都没有给出默认值,因此当您尝试修改 int 而不初始化它时会收到此错误,这与引用类型不同,而 Java 给出它是默认值。

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

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

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