无法弄清楚为什么有些变量不会初始化

San*_*y B 2 java compiler-errors return

public static String produceAnswer(String y) {
    int space1Location = y.indexOf(" ");
    String value1 = y.substring(0, space1Location - 1);
    String value2 = y.substring(space1Location + 3);
    String operator = y.substring(space1Location + 1, space1Location + 2);
    int underLocation = value2.indexOf("_");
    int slashLocation = value2.indexOf("/");
    String wholeNum;
    String numerator;
    String denominator;
    if(underLocation != -1) {
        wholeNum = value2.substring(0, underLocation);
        numerator = value2.substring(underLocation + 1, slashLocation);
        denominator = value2.substring(slashLocation + 1);
    }
    else if(underLocation == -1 && slashLocation != -1) {
        numerator = value2.substring(0, slashLocation);
        denominator = value2.substring(slashLocation + 1);
        wholeNum = "0";
    }
    else if(underLocation == -1 && slashLocation == -1) {
        wholeNum = value2;
        numerator = "0";
        denominator = "1";
    }
    return "whole:" + wholeNum + " numerator:" + numerator + " denominator:" + denominator;
}
Run Code Online (Sandbox Code Playgroud)

我的代码中的return语句由于某种原因不起作用.它说变量还没有被初始化,这对我来说没有意义,因为我肯定在if语句中初始化它们吧?这有什么不对?

Era*_*ran 6

当你编写一个if-else-if...没有final 的语句时else,编译器不知道是否保证其中一个条件true,这意味着它不确定你的局部变量是否会被初始化.

你应该把最后一个else if改为else.

if(underLocation != -1) {
    wholeNum = value2.substring(0, underLocation);
    numerator = value2.substring(underLocation + 1, slashLocation);
    denominator = value2.substring(slashLocation + 1);
} else if (underLocation == -1 && slashLocation != -1) {
    numerator = value2.substring(0, slashLocation);
    denominator = value2.substring(slashLocation + 1);
    wholeNum = "0";
} else {
    wholeNum = value2;
    numerator = "0";
    denominator = "1";
}
Run Code Online (Sandbox Code Playgroud)

甚至:

if (underLocation != -1) {
    wholeNum = value2.substring(0, underLocation);
    numerator = value2.substring(underLocation + 1, slashLocation);
    denominator = value2.substring(slashLocation + 1);
} else if (slashLocation != -1) {
    numerator = value2.substring(0, slashLocation);
    denominator = value2.substring(slashLocation + 1);
    wholeNum = "0";
} else {
    wholeNum = value2;
    numerator = "0";
    denominator = "1";
}
Run Code Online (Sandbox Code Playgroud)

因为如果第一个条件是false,我们已经知道underLocation保证-1处于第二个条件,所以测试它就足够了slashLocation != -1.