private int getBirthdayYear(){
Random r1 = new Random();
int x = r1.nextInt(1000);
int year = 1000+ x;
return birthdayYear;
}
private String getBirthday(){
int year = getBirthdayYear();
Random r2 = new Random();
int y = r2.nextInt(11);
String monthStr;
int month = 1 + y;
switch (month) {
case 1: monthStr = "January";
break;
case 2: monthStr = "February";
break;
case 3: monthStr = "March";
break;
case 4: monthStr = "April";
break;
case 5: monthStr = "May";
break;
case 6: monthStr = "June";
break;
case 7: monthStr = "July";
break;
case 8: monthStr = "August";
break;
case 9: monthStr = "September";
break;
case 10: monthStr = "October";
break;
case 11: monthStr = "November";
break;
case 12: monthStr = "December";
break;
default: monthStr = "Invalid";
break;
}
Random r3 = new Random();
**int day;// day variable declared as int**
if(month == 1||month == 3||month == 5||month == 7||month == 8||month == 10||month == 12){
int z1 = r3.nextInt(30);
day = 1 + z1;
}
else if(month == 2||month == 4||month == 6||month == 9||month == 11){
int z2 = r3.nextInt(29);
day = 1 + z2;
}
else if(month == 2 & year%4 ==0){
int z3 = r3.nextInt(28);
day = 1 + z3;
}
else if(month == 2 & year%4 != 0){
int z4 = r3.nextInt(27);
day = 1 + z4;
}
**birthday = monthStr + " " + day + "th " + year;// error here. day variable is not initialized
return birthday;**
}
这是一个生成随机生日的代码,我不确定它是否有效。我还在努力。现在,当我尝试编译此代码时,它表示day变量尚未初始化。但是,我已经说过int day;我该怎么做才能解决这个问题?
答案 0 :(得分:2)
在Java中,您不能使用可能未初始化的变量。 “未初始化”表示该变量可能未设置为任何内容。如果编译器无法证明变量总是被初始化,则会产生错误。
int a;
// a is uninitialized
if(r.nextInt(10) < 2)
a = 5;
// a has an 80% chance of still being uninitialized
System.out.println(a); // error: a might not be initialized.
在你的情况下:
int day;
// day is uninitialized
if(month == 1||month == 3||...){
int z1 = r3.nextInt(30);
day = 1 + z1;
}
else if(month == 2||month == 4||month == 6||month == 9||month == 11){
int z2 = r3.nextInt(29);
day = 1 + z2;
}
else if(month == 2 & year%4 ==0){
int z3 = r3.nextInt(28);
day = 1 + z3;
}
else if(month == 2 & year%4 != 0){
int z4 = r3.nextInt(27);
day = 1 + z4;
}
// if the month wasn't between 1 and 12, day is still uninitialized
编译器不够智能,无法检测month
始终在1到12之间。
修复是为了确保始终将day
设置为某个内容,即使month
不在该范围内。
一种方法:
int day;
// day is uninitialized
if(month == 1||month == 3||...){
int z1 = r3.nextInt(30);
day = 1 + z1;
}
else if(month == 2||month == 4||month == 6||month == 9||month == 11){
int z2 = r3.nextInt(29);
day = 1 + z2;
}
else if(month == 2 & year%4 ==0){
int z3 = r3.nextInt(28);
day = 1 + z3;
}
else if(month == 2 & year%4 != 0){
int z4 = r3.nextInt(27);
day = 1 + z4;
}
// THIS PART IS NEW
else
day = -1; // this line will never actually run
现在,编译器可以告诉我,无论发生什么,{if}语句结束后,day
总是设置为某种东西。
请注意,day = -1;
实际上从未运行过。只有这样,编译器才能证明day
总是有值。
另一种解决错误的方法是将int day;
更改为int day = -1;
- 出于同样的原因。
答案 1 :(得分:1)
因为你在if-else块中将值赋给day,但是你没有else块。因此,如果if-else中的所有条件都不合适,则不会初始化该日期。 你需要添加一个else块:
else {
day = ...;
}
答案 2 :(得分:1)
我在这里看到两个问题:
(1)。 int day; //声明为int的日变量
每当你声明一个变量时。用一些值初始化它。 正如我的学者所说,
int day=-1;
应该是合适的。
(2)。 在,
private int getBirthdayYear()
{
Random r1 = new Random();
int x = r1.nextInt(1000);
int year = 1000+ x;
return birthdayYear;
}
在这里,我不确定为什么你在变量'year'上进行计算 从函数返回另一个变量'birthdayYear'(我假设为全局变量)。 你应该从那里回来'年'。
希望这有帮助。
答案 3 :(得分:0)
您已声明它,但尚未初始化int。初始化它看起来像这样:
int day = 0;
答案 4 :(得分:0)
您可能必须在定义它之前初始化,即:
int day = -1;
我认为Java不知道你是在初始化变量,还是只是躺在那里,没有任何价值,然后再添加到另一个变量。
答案 5 :(得分:0)
默认情况下,局部变量(方法中的变量)未初始化,因此输入:
int day; //day doesn`t have a value here
没有为day
设置默认值。如果day
是一个实例变量(读取一个类变量),它将被设置为默认值0
,因此,在方法内部先初始化该变量以使用它:
int day = 0;
答案 6 :(得分:0)
您为day
和if
内部的else if
分配值。如果它们都恰好是false
,则变量将不会获得任何值。
int day;
只是一个声明。要初始化它,您可以int day = 0;
。
或者,您可以在else
的末尾添加if
,并为day
分配一个值。
答案 7 :(得分:0)
首先,您应该为int day = 1
之类的日期提供默认值。其次,你可以查看给定月份/年的天数,java.util.Calendar
就是这样 -
java.util.Calendar cal = java.util.Calendar.getInstance();
cal.set(java.util.Calendar.YEAR, year);
cal.set(java.util.Calendar.MONTH, month-1); // [... ] JANUARY which is 0.
int maxDays = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
答案 8 :(得分:0)
问题是您正在使用没有 else 条件的逻辑初始化day
。
考虑以下明显的例子:
int initMe;
boolean willInit = false;
if (willInit) {
initMe = 1;
}
System.out.println("initMe is " + initMe);
显然这不起作用,因为initMe
不会在该逻辑中初始化。解决方案是将其初始化为默认值:
int initMe = -1;
或者给条件另外说明:
if (willInit) {
initMe = 1;
} else {
initMe = -1;
}
任何一种解决方案都可行。对于您的情况(您的条件似乎决定了该月的天数),您可能有其他错误情况或重构,所以否则是“默认”:
if (/* is February */) {
if (/* is a leap year */) {
} else {
/* it's not a leap year */
}
} else if (/* month has 31 days */) {
} else {
/* presume it has 30 */
}
作为旁注,我注意到您似乎试图用Scanner#nextInt(int)方法“限制”输入值,但我认为这不会给您带来您期望的结果。 int参数实际上是一个基数参数。因此nextInt(28)
之类的内容实际上指定输入应该被解释为 base 28 数字。如果你输入,比如“15”,扫描仪实际上会返回一个值为33的整数。
答案 9 :(得分:0)
int i; // Declaration
i = 0; // Initialization
int i = 0; // Declaration + Initialization