如何返回If条件中的语句(处理)

时间:2015-02-13 20:34:45

标签: if-statement processing

我正在创建一个名为bondPositionCounter的整数,它应该根据满足if语句中两个条件之一的条件返回一个整数。但是,即使其中一个条件为真,整数方法总是返回1.如果没有最终返回行,我会收到一个错误,声称该方法必须返回int类型的东西。这是为什么?


我的代码如下。

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

2 个答案:

答案 0 :(得分:0)

  

如果没有最终的返回行,我会收到一个声明该方法的错误   必须返回int类型的东西。那是为什么?

因为当你声明一个带有返回类型的方法时,方法必须返回一些东西

让我们举个例子

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语句。

一条建议

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 )) {
}

答案 1 :(得分:0)

对于一系列if - else if语句,编译器无法知道它们是否都是错误的。如果发生这种情况,它将到达方法的末尾而不返回违反其合同的值。

因此,在这种情况下,只有当您的两个return 1条件为if时,您的false才会发生。它在语义上等同于使用if/else if子句结束else块并返回一个值:

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

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

如果您不打算使用默认返回值,那么您可以提出异常(我链接,但您没有指定语言,您可以是C / C ++或Java基于代码)作为默认情况。