-1

我正在编写一个函数来计算两个数字的最大公分母。我的函数的返回类型是int,它的参数是两个ints。代码还没有完成,但到目前为止它有两个if()块。

这是我的代码:

public int gcd(int num1,int num2) {

    if(num1>num2 && num1%num2==0){
       return num2;
    }

    if(num1<num2 && num2%num1==0){           
       return num1;
    }

}

IDE 显示missing return statement错误。如果我将函数返回类型声明为void并使用System.out.println()语句,它就可以正常工作。那么为什么像上面那样将返回类型改为 时会出现这个错误int呢?

是否每个函数都if()需要else有一个返回类型不是的函数void

4

7 回答 7

3

是否每个“if”都应该在返回类型不是“void”的函数中有一个 else cumpulsory?

不一定,只要每个代码路径都有return一个值或throw一个异常,而您的方法中不是这种情况(例如,num1 = 0, num2 = 0; 两者if都不会输入)。

如果您知道应该根据传递给方法的值输入其中一个ifs ,则可以在方法的末尾添加一个虚拟对象(或抛出异常,这实际上可能更适合调试)。return

于 2013-08-01T17:44:59.070 回答
3

void通过具有不返回返回的方法的每个代码路径都必须返回一个值。

您有一个返回的代码路径,即当两个ifs 评估为时false,但不返回值。即:

public int gcd(int num1, int num2) {
    if(num1 > num2 && num1 % num2 == 0) {
        return num2;
    }
    if(num1 < num2 && num2 % num1 == 0) {
        return num1;
    }

    // return, but no return value!
}

请注意,这并不意味着每个可能的路径都必须返回,只是每个返回的可能路径都必须返回一个值。这是合法的:

public int M() throws Exception {
    throw new Exception();
}

没有通过该方法返回不返回值的路径

于 2013-08-01T17:44:41.583 回答
2

您需要为方法的所有执行路径创建一个 return 语句。if当您的两个条件都失败时,您会丢失 return 语句:

public int gcd(int num1,int num2) {

    if(num1>num2&&num1%num2==0){

       return num2;
    }
    if(num1<num2&&num2%num1==0){

       return num1;
    }

   // add a return statement here as well
}

如果您愿意,请提供建议

代码中有太多的返回语句会使读者感到困难。在不同的 if 条件下设置值并具有单个返回是更好的选择。就像是:

公共int gcd(int num1,int num2){

    int returnValue = 0;

    if(num1>num2&&num1%num2==0){

       returnValue = num2;
    }
    if(num1<num2&&num2%num1==0){

       returnValue = num1;
    }
    return returnValue;    
}
于 2013-08-01T17:45:22.947 回答
2

简单明了..如果您的两个 if 条件都失败会发生什么,因为您已向编译器承诺您将返回一个 int ,但最后您试图欺骗他。

这就是编译器抱怨的原因。:)

谢谢

于 2013-08-01T17:46:52.030 回答
0

您必须对所有可能的路径都有一个返回,包括如果您的两个 if 语句都被证明是错误的。

于 2013-08-01T17:44:50.533 回答
0

如果 num1 == num2 或者 num1 和 num2 不是除数(num2 的 num1 或 num1 的 num2),则需要返回一些内容。

gcd 是指最大公约数吗?如果是这样,那么您可能错过了递归调用:

public int gcd(int num1,int num2) {

  if(num1>num2&&num1%num2==0){
     return num2;
  }
  if(num1<num2&&num2%num1==0){
   return num1;
  }
  return gcd(???, ???);
}
于 2013-08-01T17:48:01.937 回答
0

是否每个 if() 都需要在具有除 void 之外的返回类型的函数中具有 else ?

我更喜欢返回类型不是 void 的函数,而不是必须返回类型。Java 编译器期望相同。

于 2013-08-01T17:51:53.433 回答