我正在创建一个名为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;
}
答案 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基于代码)作为默认情况。