初始化为什么我不能在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”。案例中的初始化是否无效?我在开关外声明了月份变量
# 1 楼答案
尝试初始化月份
int month=0;
# 2 楼答案
您需要保证在运行时,无论
textmont
有哪个值,month
都会得到一个值,现在,再次查看开关。。。 并确保
default
案例没有赋值给变量month
如果发生这种情况,则月份将没有初始值。。。在那里添加正确的赋值,就像前面的其他注释一样,声明并初始化变量
# 3 楼答案
问题是int是一种基本类型,所有基本类型在运行时都没有默认值,因此在尝试在不初始化int的情况下修改int时会出现此错误,这与reference type不同,而Java提供了它的默认值
正如您在
default
案例中看到的,您没有初始化int变量month
,因此对于编译器来说switch case
有可能会转到default
。如果在case switch
之后使用month变量,则它没有任何默认值,因此会出现编译器错误实际上,如果您在默认情况下使用pt
month =0;
或赋值,它将正常编译你可以阅读更多: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html 以及: Java: Why am I required to initialize a primitive local variable?
# 4 楼答案
当您声明
month
时,应该给它一个默认值(比如0或-1),否则JVM无法验证是否将为指向print语句的所有程序路径定义month
在这种情况下,如果输入了无效的
month
值,print语句将输出什么?Java不知道。Java或者需要为每个变量指定一个默认值,或者需要能够确保每个可能的程序路径都为变量指定一个值因此,您可以将
month
设置为在int month
中有一个值(默认值),或者让switch
语句中的default
case为其赋值(考虑所有程序路径)。这样,无论程序采用何种路径,month
在您尝试打印时都会有一个值您可能希望查看的另一个选项是在给定无效月份时抛出错误并终止程序。由于没有循环输入,单个无效输入也会导致输出无效。在这种情况下,最好向用户发出他/她的输入错误的信号,并强迫他们重新开始,而不是让错误传递到输出
# 5 楼答案
使用此更新您的月份声明
如果初始化是在可能只能有条件执行的语句中完成的,则会引发此错误。 或者,如果您添加一个
default
语句,该语句也将为month
赋值,那么它可以正常编译# 6 楼答案
与其他回复相反,您不需要在声明中初始化
month
问题是,如果
textmonth
不是任何文本值,则执行将落到default
情况下,其中月份没有初始化您可以将其初始化为无效值,例如
default
案例中的0
,但更好的选择可能是给出错误消息并中止执行