我有这个代码:
public int Bol(int x, int y){
if(x > y){
return (x / y);
}else if(x < y){
return (y / x);
}
}
引发此错误:“此方法必须返回 int 类型的结果”。为什么必须呢?
我知道当我改成else if
这个else
问题时就解决了。但是,当我使用 else-if 时,为什么会出现这个错误?
如果不满足任何条件(即,何时x == y
)会发生什么?该方法将返回什么?所以你需要返回一个默认值:
public int Bol(int x, int y){
if(x > y){
return (x / y);
}else if(x < y){
return (y / x);
}
return 0; // or whatever default value you need
}
使用单个也很有帮助return
:
public int Bol(int x, int y){
int result = 0; //whatever default value you want
if(x > y) {
result = (x / y);
} else if(x < y) {
result = (y / x);
}
return result;
}
“我知道当我将 else if 更改为 else 时,这个问题就解决了。但是为什么当我使用 else-if 时,会出现这个错误?”
首先,我建议您复习一下if
、else
和else if
工作原理,因为了解分支如何工作是编写正确运行代码所需的核心知识。
使用时它不起作用的原因是,只有当块的布尔表达式评估为真时,块else if
内的代码else if
才会执行。else if
因此,Java 编译器会看到没有任何块被执行的情况(因此 theif
和else if
块都没有被执行)。这意味着存在没有return
执行任何语句的情况。这违反了方法的签名,即该方法总是返回一个int
. 现在,当您将 the 更改else if
为 an时,您的代码可以工作,else
因为如果前面的(或s)块没有运行,an 中的代码else
将始终运行。if
else if
那么当 x == y 时会发生什么?你回什么?
您的方法被定义为返回一个 int。但是当 x == y 时它没有返回任何东西。
你可以写
if (x > y) {
return x/y;
} else if (x < y) {
return y/x;
} else {
return 1; // x == y therefore x/y is 1.
}
此外,请注意 x 或 y 何时为 zeor。假设 x=1 和 y=0。你认为会发生什么?
有时您的代码没有返回值。IE 如果 if 或else if
条件都不满足。因此,编译器会标记错误。
如果你有 aelse
而不是else if
,编译器肯定在这两种情况下你都会返回一个值。这就是为什么它很好。
另请注意- “涵盖所有情况”是不够的。例如,如果您将 else if 更改为
else if ( x <= y ) {
....
}
然后在技术上涵盖所有情况(同时修改除外)。尽管如此,编译器要知道这一点并不容易,它会标记一个错误。
编译器确定您有返回值的唯一方法是if 条件之外的aelse
或 a 。return
了解您的代码逻辑。会不会有两个if
条件都不满足的情况?是的,这是可能的(即 when x==y
),在这种情况下,函数不会返回任何内容。对于这种情况,您需要在函数中具有默认返回值,您错过了它并且编译器正在抱怨。
现在有可能你的函数没有返回任何东西。例如,如果 x = y,那么既不成立(x > y)
也不 (x < y)
成立。因为您的函数只有在 x > y 和 y > x 时定义的返回语句,所以它不会在所有情况下都返回。
解决此问题的一种方法是在 if 语句之后添加默认 return 语句:
public int Bol(int x, int y){
if(x > y){
return (x / y);
}else if(x < y){
return (y / x);
}
return 1;
}
此时其他响应者都没有注意到您的方法签名需要返回类型:
public int Bol(int x, int y){
int
afterpublic
表示返回类型。您必须从此方法返回该类型的内容,因为 Java 是一种强类型语言。当您else
在 an 中使用时if
,它将捕获其他条件未捕获的所有情况。
public int Bol(int x, int y){
if(x > y){
return (x / y);//returns a double, which can be cast to an int
}else if(x < y){
return (y / x); //returns a double, which can be cast to an int
}
} //if this line is reached, nothing is being returned, so the compiler throws an error.