错误:缺少Java中的返回值

时间:2014-07-30 05:19:00

标签: java methods

所以我建立了一种寻找素数的方法。它似乎只有当我强制将其标记为真时才有效。但是当我按照我的意愿离开它时,编译器不同意。

如何满足缺失的返回值错误?

private static boolean isPrime( int n)
    // write a loop that sets a loop variable named divisor that goes from 2 to n/2
    // in the loop call isFactor to see if divisor divides n evenly
    // if it does print out that divisor followed by a space (no newline)
    {
        for (int divisor = 2; divisor <= n; divisor++)
        {
            boolean prime = true;   
            for (int i = 2; i < divisor; i++)
            {
                if (isFactor(n, divisor))
                {
                    return false;
                }

            }

        }
        return true; // i just put this here so it would compile at all
    }

4 个答案:

答案 0 :(得分:2)

如果你的循环永远不会执行,你永远不会返回任何内容,而且你告诉Java你将返回某些东西,无论你的逻辑是否做了什么。

在方法内部的花括号之间查看代码,作为在程序生命周期内可能执行或不执行的块。如果删除整个for块,则没有任何有效的返回语句,Java可以使用它来表示“是的,如果一切都失败了,那么我可以使用此值。”

也就是说,您的代码可以在一次运行中表现如下:

public boolean isPrime(int n) {
    // outer for block is removed
}

...然后在另一场比赛中这样:

public boolean isPrime(int n) {
    for (int divisor = 2; divisor <= n; divisor++) {
        // inner for block is removed
    }
}

......等等,直到你重建整个方法。

在上面的所有代码片段中,如果外部块和内部块都没有执行(并且通过扩展名,if语句),那么您的程序不会在所有路径上返回任何内容。

这在Java Language Specification,§8.4.7:

中正式指定
  

如果声明方法具有返回类型,则如果方法的主体可以正常完成(第14.1节),则会发生编译时错误。

     

换句话说,具有返回类型的方法必须仅使用提供值返回的return语句返回;它不允许“掉落身体的末端”。

答案 1 :(得分:1)

我不知道你的方法isFactor()是如何工作的,这就是你应该怎么做的

private static boolean isPrime( int n)
{
    boolean prime = true;

    for (int divisor = 2; divisor <= n; divisor++)
    {          
        for (int i = 2; i < divisor; i++)
        {
            if (isFactor(n, divisor))
            {
               prime =false;
            }
        }
    }
    return prime;
}

顺便说一句,我会像我这样简单地使用isPrime()方法:

public static boolean isPrime(int n){
    for(int i = 2 ; i < n ; i++){
        if(n % i == 0){
            return false; 
        }
    }
    return true;
}

答案 2 :(得分:0)

你也可以这样做。因为你在if条件中返回false,所以程序应该知道它是否不会进入if条件我应该返回什么。

private static boolean myMethod( int n)
  boolean flag = true;
    // some code here

    flag = false;

     //  again some code here

    flag = true

     // Finally return the flag

    return flag;

}

已编辑

在您的情况下,您可以像这样使用它

 private static boolean isPrime( int n)
{
boolean flag = true;

for (int divisor = 2; divisor <= n; divisor++)
{          
    for (int i = 2; i < divisor; i++)
    {
        if (isFactor(n, divisor))
        {
           flag =false;
        }
    }
}
return flag;
 }

答案 3 :(得分:0)

您的实现完全有效,但仅限于return true语句。没有return true语句,你的程序永远不会找到素数;它会正确识别数字不是素数,或者它不会返回任何东西。如果为n传递了小于2的值,它也会决定不返回任何内容。值得庆幸的是,当你给出一个非void返回类型时,编译器不会让你决定不返回任何东西(除非你抛出一个异常,但那不是重点)。

所以编写代码的方式很好。您通过尝试查找除数来识别非素数,并在找到除数后立即返回。如果找不到,程序中的最后一个语句会声明通过消除过程找到的素数。但是,您将需要检查内部for循环。它不会更改传递给isFactor()的参数,因此它完全无关紧要。这样做效果也会更好:

private static boolean isPrime( int n)
// write a loop that sets a loop variable named divisor that goes from 2 to n/2
// in the loop call isFactor to see if divisor divides n evenly
// if it does print out that divisor followed by a space (no newline)
{
    for (int divisor = 2; divisor <= n; divisor++)
    {
       if (isFactor(n, divisor))
       {
         return false;
       }
    }
    return true; // i just put this here so it would compile at all
}