概念:"变量未初始化"

时间:2014-10-12 04:38:00

标签: java

我想知道为什么我的变量不会在这里返回:

   public int getAge() {
    int age;
    if (currentMonth != birthMonth) {
        if (currentMonth > birthMonth) {
            age = currentYear - birthYear;

        }
        else {
            age = currentYear - birthYear + 1;

        }
    }
    if (currentMonth == birthMonth) {
        if (currentDay >= birthDay) {
            age = currentYear - birthYear;

        }
        else {
            age = currentYear - birthYear + 1;

        }
    }
    return age; 
}

所有变量(例如currentMonth和birthMonth)都已初始化,但我似乎无法获得该年龄的回报。

3 个答案:

答案 0 :(得分:2)

请注意,您声称您的变量已在第2行初始化,但事实并非如此。该变量在此处声明为 ,但从未初始化(在if语句之外)。

IDE可能会告诉您年龄是单元化的,即使很明显此功能可以正常运行。问题是,如果两个if语句都没有输入,那么它有可能被未初始化。

Erwin的答案中的解决方案是正确的,你需要写一个else而不是另一个if语句。

答案 1 :(得分:0)

如果我没有输入那些if块中的任何,我的age设置值不会令人满意。 Java将此视为编译时失败,因为它无法保证程序的执行流程将设置age

Java不会查看条件分支以查看它们是否会触发;它将查看条件分支以查看是否有可能不会。这就是为什么你的变量不会被初始化。

如果您使用else语句,因为您的条件只有两种可能的情况,那么Java将能够保证通过其执行流程设置age的值。

public int getAge() {
    int age;
    if(currentMonth != birthMonth) {
        if(currentMonth > birthMonth) {
            age = currentYear - birthYear;

        } else {
            age = currentYear - birthYear + 1;

        }
    } else {
        if(currentDay >= birthDay) {
            age = currentYear - birthYear;

        } else {
            age = currentYear - birthYear + 1;

        }
    }
    return age;
}

答案 2 :(得分:0)

虽然你有两个相互排斥的if语句,但这不是编译器可以检测的(根据规范甚至不允许这样做)

要使编译器检测到第二个块始终执行,如果第一个块不是,请重写if语句。你的代码是:

if (currentMonth != birthMonth) {
    // Block 1
}
if (currentMonth == birthMonth) {
    // Block 2
}

将其更改为:

if (currentMonth != birthMonth) {
    // Block 1
} else {
    // Block 2
}

然后编译器将能够检测到您始终初始化变量age