int变量未初始化

时间:2013-12-01 02:07:51

标签: java variables

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;我该怎么做才能解决这个问题?

10 个答案:

答案 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)

您为dayif内部的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