为什么我不能在循环内编写return语句?

时间:2019-03-01 08:13:19

标签: java

我正在编写一个函数,该函数给了我最大的因素,即一个数字的质数。例如,数字12会给我3。我的初始代码是:

public static int getLargestPrime(int number) {
        if (number < 2) {
            return -1;
        }

            for (int num = 2; num <= number; num++) {
                int mod = number % num;
                if (mod == 0) {
                    int div = number / num;
                    if (div == 1) {
                        return number;
                    } else {
                        number = div;
                        num = 1;
                    }
                }
            }
    }

但是我一直遇到丢失的return语句错误,因此我添加了一个:

public static int getLargestPrime(int number) {

        if (number < 2) {
            return -1;
        }

            for (int num = 2; num <= number; num++) {
                int mod = number % num;
                if (mod == 0) {
                    int div = number / num;
                    if (div == 1) {
                        return number;
                    } else {
                        number = div;
                        num = 1;
                    }
                }
            }
            return number;
    }

现在是正确的,但我不太了解其背后的逻辑。我已经读过,在某些情况下循环将不会执行,因此即使我的循环未执行,我也需要返回一些内容,但是我无法想到在任何情况下循环都不会执行。从字面上看,大于等于2的任何东西都会触发循环,小于2的任何东西都会返回-1。所以我的问题是在什么情况下循环将不会执行?而且,for循环之后的return语句实际上没有意义,是否有更好的方法来解决丢失的return语句?

4 个答案:

答案 0 :(得分:1)

在您的初始代码中:

if (div == 1) {
    return number;
} else {
    number = div;
    num = 1;
}
                    }

万一您总是有假的话,就永远不会到达return语句。 编译器无法预测它是否会真正发生,因此它在if和else块中都需要return语句。因此,它实际上与for循环无关。

答案 1 :(得分:0)

两个建议 1.最好不要更改您传递的参数(在这种情况下为数字变量) 2.尽可能少的返回语句。

在您的情况下,您可以在for-lopp之外声明另一个变量tempNumber,并为其分配“ number”。在您要返回的if条件下,您会“中断”。在函数末尾返回数字。这样总是返回数字

public static int getLargestPrime(int number) {

    if (number < 2) {
        return -1;
    }

    int tempNumber = number;
    for (int num = 2; num <= tempNumber; num++) {
        int mod = tempNumber % num;
        if (mod == 0) {
            int div = tempNumber / num;
            if (div == 1) {
                break;
            } else {
                tempNumber = div;
                num = 1;
            }
        }
    }
    return tempNumber;

}

答案 2 :(得分:0)

  

我想不出循环不会执行的任何情况

必须以有效且定义明确的方式编写方法。将其视为帮助编译器的一种形式。

在编译时检查return语句的存在。如果编译器发现一个可能的执行分支未以有效的return语句(或显式引发的异常)结尾,则它会出错。 Read more

甚至...

int method() {
    if (true)
        return 1;
}

...将无法使用

进行编译

This method must return a result of type int

答案 3 :(得分:0)

https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.14

Java编译器不会在循环内验证您的代码,因此您需要在所有fork中放入return语句。 覆盖率测试会警告您,因为您的代码无法访问,因此需要重新计划代码。

注意:您需要检查prime test直到等于Math.sqrt(number),如果大于不带分隔符的sqrt,则可以中断循环并返回number