【问题标题】:Can't figure out why some variables won't initialize无法弄清楚为什么某些变量不会初始化
【发布时间】:2019-05-05 03:36:21
【问题描述】:
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;
}

我的代码中的 return 语句由于某种原因不起作用。它说变量尚未初始化,这对我来说没有意义,因为我肯定在 if 语句中初始化了它们,对吗?这里有什么问题?

【问题讨论】:

  • 哪些变量没有被初始化?你能说得更具体些吗
  • 如果没有,如果条件评估为真呢?
  • 变量 'wholeNum'、'numerator' 和 'denominator' 显然都没有被初始化。
  • 阅读 JLS 关于可达性和明确分配的章节。 :)
  • 编译器应该如何知道if 条件之一始终为真,如果是这样,为什么要对最后一个else if 进行测试?

标签: java compiler-errors return


【解决方案1】:

当您编写没有最终 elseif-else-if... 语句时,编译器不知道其中一个条件是否保证为 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";
}

甚至:

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";
}

因为如果第一个条件是false,我们已经知道underLocation在第二个条件下肯定是-1,所以测试slashLocation != -1就足够了。

【讨论】:

  • 你不需要那个underLocation == -1
  • 谢谢!这解决了它。
猜你喜欢
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多