无法在`if`块中返回变量值

时间:2013-08-01 17:42:44

标签: java return

我正在编写一个函数来计算两个数字的最大公分母。我的函数的返回类型是int,其参数是两个int。代码尚未完成,但到目前为止它有两个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

7 个答案:

答案 0 :(得分:3)

返回的非void返回方法的每个代码路径必须返回一个值。

您有一个返回的代码路径,即当if评估为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();
}

通过该方法返回的 no 路径不会返回值。

答案 1 :(得分:3)

  

在'void'之类的返回类型的函数中,每个'if'是否应该有一个cump?

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

如果你知道根据你传递给方法的值输入其中一个if s ,你可以在那里添加一个虚拟return方法结束(或抛出异常,这实际上可能更适合调试)。

答案 2 :(得分: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
}

建议您是否愿意遵循

代码中有太多的返回状态会让读者难以理解。在不同的条件下设置值并且只有一次返回是更好的选择。类似的东西:

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

答案 3 :(得分:2)

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

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

由于

答案 4 :(得分:0)

您必须为所有可能的路径返回,包括两个if语句都是假的。

答案 5 :(得分:0)

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

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(???, ???);
}

答案 6 :(得分:0)

每个if()都需要在函数中使用else而不是void吗?

我宁愿选择一个返回类型不为void的函数来返回类型。 Java编译器期望相同。