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

Java 为什么我不能在循环中编写return语句?,java,Java,我在写一个函数,它给我一个最大的因子,一个数的素数。例如,数字12会给我3。我最初的代码是: public static int getLargestPrime(int number) { if (number < 2) { return -1; } for (int num = 2; num <= number; num++) { int mod = number %

我在写一个函数,它给我一个最大的因子,一个数的素数。例如,数字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语句?

在初始代码中:

if (div == 1) {
    return number;
} else {
    number = div;
    num = 1;
}
                    }
万一你总是有false,你就永远不会得到return语句。 编译器不能预测它是否真的会发生,所以在if和else块中都需要返回语句。所以它实际上与for循环无关。

两个建议 1.最好不要更改在这个case number变量中传递的参数 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;

}
我想不出有什么情况我的循环不会执行

必须以有效、定义良好的方式编写方法。将其视为帮助编译器的表单

在编译时检查return语句是否存在。如果编译器发现可能的执行分支未以有效的返回语句或显式抛出的异常结尾,则会运行错误

甚至

int method() {
    if (true)
        return 1;
}
。。。将无法使用

此方法必须返回int类型的结果

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


注意:您需要检查您的until或equals Math.sqrtnumber,如果大于此sqrt(不带除法器),您可以中断循环并返回数字

,但您需要为所有场景的,这也意味着当迭代不循环时。我建议添加新变量,例如returnValue,您将在需要的每个位置设置它,并且在该函数末尾的所有循环返回该值之后,例如理论上的情况,您永远不会进入if for div==1。如果这种情况以某种方式发生,您将永远不会返回,因此需要在for循环之后返回。这种情况可能永远不会出现,但编译器无法知道这一点,因此这就是在for循环之后返回语句的原因。你也可以只抛出一个专用的异常,而不是返回数字。如果你是在else情况下或者在循环外,你应该返回一些int i。返回0;如果您确定某个值将在循环的某个时间返回,请添加throw new AssertionErrorNever ending here;在方法的底部。这将使编译器满意,除非您的假设被打破,否则不会产生任何效果。