1

我有这个代码:

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 时,为什么会出现这个错误?

4

6 回答 6

3

如果不满足任何条件(即,何时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 时,会出现这个错误?”

首先,我建议您复习一下ifelseelse if工作原理,因为了解分支如何工作是编写正确运行代码所需的核心知识。

使用时它不起作用的原因是,只有当块的布尔表达式评估为真时,块else if内的代码else if才会执行​​。else if因此,Java 编译器会看到没有任何块被执行的情况(因此 theifelse if块都没有被执行)。这意味着存在没有return执行任何语句的情况。这违反了方法的签名,即该方法总是返回一个int. 现在,当您将 the 更改else if为 an时,您的代码可以工作,else因为如果前面的(或s)块没有运行,an 中的代码else始终运行。ifelse if

于 2012-08-24T22:45:01.617 回答
2

那么当 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。你认为会发生什么?

于 2012-08-24T22:44:35.143 回答
1

有时您的代码没有返回值。IE 如果 if 或else if条件都不满足。因此,编译器会标记错误。

如果你有 aelse而不是else if,编译器肯定在这两种情况下你都会返回一个值。这就是为什么它很好。

另请注意- “涵盖所有情况”是不够的。例如,如果您将 else if 更改为

else if ( x <= y ) {
....
}

然后在技术上涵盖所有情况(同时修改除外)。尽管如此,编译器要知道这一点并不容易,它会标记一个错误。

编译器确定您有返回值的唯一方法是if 条件之外的aelse或 a 。return

于 2012-08-24T22:45:36.927 回答
0

了解您的代码逻辑。会不会有两个if条件都不满足的情况?是的,这是可能的(即 when x==y),在这种情况下,函数不会返回任何内容。对于这种情况,您需要在函数中具有默认返回值,您错过了它并且编译器正在抱怨。

于 2012-08-24T22:47:54.477 回答
0

现在有可能你的函数没有返回任何东西。例如,如果 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;
}
于 2012-08-24T22:47:02.370 回答
0

此时其他响应者都没有注意到您的方法签名需要返回类型:

public int Bol(int x, int y){

intafterpublic表示返回类型。您必须从此方法返回该类型的内容,因为 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.
于 2012-08-24T22:47:11.573 回答