有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

初始化为什么我不能在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可能尚未初始化”,同时指向println语句中的“month”。案例中的初始化是否无效?我在开关外声明了月份变量


共 (6) 个答案

  1. # 1 楼答案

    尝试初始化月份

    int month=0;

  2. # 2 楼答案

    您需要保证在运行时,无论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

    如果发生这种情况,则月份将没有初始值。。。在那里添加正确的赋值,就像前面的其他注释一样,声明并初始化变量

  3. # 3 楼答案

    问题是int是一种基本类型,所有基本类型在运行时都没有默认值,因此在尝试在不初始化int的情况下修改int时会出现此错误,这与reference type不同,而Java提供了它的默认值

    正如您在default案例中看到的,您没有初始化int变量month因此对于编译器来说switch case有可能会转到default。如果在case switch之后使用month变量,则它没有任何默认值,因此会出现编译器错误

    实际上,如果您在默认情况下使用ptmonth =0;或赋值,它将正常编译

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

  4. # 4 楼答案

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

    在这种情况下,如果输入了无效的month值,print语句将输出什么?Java不知道。Java或者需要为每个变量指定一个默认值,或者需要能够确保每个可能的程序路径都为变量指定一个值

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

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

  5. # 5 楼答案

    使用此更新您的月份声明

    int month = 0;
    

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

  6. # 6 楼答案

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

    问题是,如果textmonth不是任何文本值,则执行将落到default情况下,其中月份没有初始化

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