我如何 Return 位于 If 条件语句中的语句(处理)

How Do I Return Statements Located in If Conditionals (Processing)

我正在创建一个名为 bondPositionCounter 的整数,它应该 return 一个基于满足 if 语句中两个条件之一的条件的整数。但是,即使其中一个条件为真,整数方法总是 returns 1。如果没有最后的 return 行,我会收到一条错误消息,声称该方法必须 return 某种类型诠释。这是为什么?


我的代码如下。

    int bondPositionCounter(int i, int j) { 
    if ((g.grid.cells[i][j].isOccupied == true) && (g.grid.cells[i + 1][j].isOccupied == true)) {
      g.grid.bondsh[i][j].bondUsage = true;
      return 8 * i + j;
    } else if ((g.grid.cells[i][j].isOccupied == true) && (g.grid.cells[i][j + 1].isOccupied == true)) {
      g.grid.bondsv[i][j].bondUsage = true;
      return 56 + 8 * i + j;
    }
    return 1; 
  } 

Without the final return line, I get an error claiming that the method must return something of type int. Why is that?

因为当您使用 return 类型声明方法时,方法必须 return 某些东西

举个例子

public int checkHowReturnStatementWorks(){ // this method will return int

   if(condition a){ // condition going to be resolved at runtime
      return 1;
   }
   else if(condition b){
      return 2;
   }
}

现在假设在运行时这两个条件都不满足那么你的方法将 return ,

no idea

,编译器也有同样的疑问,这就是为什么编译器在编译时给出错误,只是你需要添加一个 return 语句。

一条建议

if ((g.grid.cells[i][j].isOccupied == true)
    && (g.grid.cells[i + 1][j].isOccupied == true)) {

}

可以替换为

if ((g.grid.cells[i][j].isOccupied) 
   && (g.grid.cells[i + 1][j].isOccupied )) {
}

在一系列 if-else if 语句的情况下,编译器无法知道它们是否全部为假。如果发生这种情况,它将在没有 returning 值的情况下到达方法的末尾,这违反了其约定。

因此,在这种情况下,只有当您的两个 if 条件为 false 时,您的 return 1 才会发生。这在语义上等同于以 else 子句结束 if/else if 块,该子句也 return 编辑了一个值:

int bondPositionCounter(int i, int j) {
    if (...) {
      return valueA;
    } else if (...) {
  return valueB;
    } else {
      return default;
    }
}

在这种情况下,您可以删除独立的 return 1,编译器会很高兴。本质上,对于具有 return 类型的任何方法, 对于所有有效代码路径 它必须 return 一个值。

如果您的意图不是要有默认的 return 值,您可以改为引发异常(我会 link,但您没有指定语言,您可以C/C++ 或 Java 基于代码)作为默认情况。