【问题标题】:Why eclipse is saying that my method doesn't return a valid result?为什么eclipse说我的方法没有返回有效结果?
【发布时间】:2019-03-08 19:08:44
【问题描述】:

我在 Java 中为数独游戏编写这段代码已有一段时间了,我不知道出了什么问题,也许是“if”或 de “For”,但 IDE 说我的方法没有返回一个布尔类型。

// check if the number has already been used in the columns
private boolean checkColumns(int x, int y, int value) {
    for (int j = 0; j < 9; j++) {
        if (this.gridPlayer[j][y].getValue() == value) return false;
        else return true;
    }

    }
// Check if the number has already been used in the lines
private boolean checkLines(int x, int y, int value) {
    for (int i = 0; i <= 9; i++) {
        if (this.gridPlayer[x][i].getValue() == value) return false;
         else return true;
    }
    }

// Check if the number has already been used and the subGrid
private boolean checkSubGrid(int x, int y) {
    for (int i = 0; i <= 9; i++) {
        for (int j = 0; j <= 9; j++) {
            if (this.gridPlayer[x][y].getValueOfSubGrid(x, y) == this.gridPlayer[i][j].getValueOfSubGrid(i, j)) {
                if (this.gridPlayer[x][y].getValue() == this.gridPlayer[i][j].getValue()) {
                    return false;
                } else {
                    return true;
                }
            } else if (this.gridPlayer[x][y].getValueOfSubGrid(x, y) != this.gridPlayer[i][j].getValueOfSubGrid(i,
                    j)) {
                return true;
            }
        }
    }
}

【问题讨论】:

  • 如果else if 检查返回假怎么办?
  • 编译器抱怨哪种方法?
  • 除非你在玩 10 格数独,否则我建议你可能指的是 i &lt; 9j &lt; 9
  • 哪种方法?您发布了 3。
  • 你确定这些循环的逻辑是对的吗?在大多数情况下,无论如何都会返回一个值,从而使循环成为单次迭代,从而使循环变得不必要。在任何情况下,checkSubGrid 并不能处理所有情况,而且寻找回报的逻辑也不是很聪明,你会希望在 for 循环之外返回。

标签: java arrays for-loop if-statement return


【解决方案1】:

欢迎,
在您的checkSubGrid() 方法中,如果运行时未输入最后一个else if,则需要返回一个值: else if (this.gridPlayer[x][y]...) {

如果方法不是void,需要放一个return。

 if(a > 1) {
   return a;
 } else {
   return b;
 }

在上面这种情况下,我们有一个if - else 语句,该方法将总是返回真或假(或有异常)。

 if(a > 1) {
   return a;
 } else if(a == 0) {
   return b;
 }

另一方面,方法可以或不能输入第二个if,他们没有回报。您不确定编译器是否会返回。

您可以通过设置默认返回或设置 else 语句来解决此问题。

 if(a > 1) {
   return a;
 } else if(a == 0) {
   return b;
 } else {
   return null;
 }

或者

 if(a > 1) {
   return a;
 } else if(a == 0) {
   return b;
 }
 return null;

【讨论】:

  • 返回null,其中返回值为boolean 类型无效(编译错误)
  • 并且编译器不会做任何复杂的事情来确保方法有返回值,例如,在 OP 的 checkColumns 中,它保证返回一个布尔值,对吗?由于原因,它仍然会发出警告。
  • 是@DaveNewton,但是如果编译器没有在for中输入,则没有返回八字。不知道什么情况下不能进入for 但可以:)
【解决方案2】:

编译器假设它不是 100% 确定来自内部的 return 语句 您的“for”循环将被调用,因此它会看到您的方法不返回任何值的路径,即使它们声明它们也是如此。

您需要在循环之外有一些返回值,即使您确定这永远不会发生,即

private boolean checkLines(int x, int y, int value) {
  for (int i = 0; i <= 9; i++) {
    if (this.gridPlayer[x][i].getValue() == value) return false;
     else return true;
  }
 return false; //even if you think it will never be run it is necessary 
}

【讨论】:

  • 这个for 循环只执行一次。我不认为那是你的意思。也从未使用过int y
  • @c0der 这正是我的意思。编译器不会假设 for 循环总是运行,即使你知道它是。我不在乎我们是否从未使用过,我只是增强了 OP 方法来告诉他问题出在哪里
  • 执行一次的for 循环有什么用?显然它没有检查整行。
  • 我认为其目的是表明需要return,而不是修复原始有缺陷的逻辑。
  • @c0der 正是 Dave Newton 所说的。我回答了这个问题并表明IDE(实际上是java编译器)不是问题,但理论上不是每个路径都返回一个值
猜你喜欢
  • 2014-06-29
  • 1970-01-01
  • 1970-01-01
  • 2019-07-29
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多