猿问

为什么我不能在循环中编写返回语句?

我正在编写一个函数,它给了我最大的因子,它是一个数字的质数。例如,数字 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;

                    }

                }

            }

    }

但是我不断收到缺少返回语句的错误,所以我添加了一个:


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语句?


慕慕森
浏览 143回答 4
4回答

慕森王

在您的初始代码中:if (div == 1) {&nbsp; &nbsp; return number;} else {&nbsp; &nbsp; number = div;&nbsp; &nbsp; num = 1;}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }万一你总是有错误,你将永远不会达到返回语句。编译器不预测它是否真的会发生,因此它需要在 if 和 else 块中都使用 return 语句。所以它实际上与for循环无关。

陪伴而非守候

我想不出我的循环不会执行的任何情况必须以有效的、明确定义的方式编写方法。将其视为帮助编译器的一种形式。return在编译时检查语句是否存在。如果编译器发现一个可能的执行分支没有以有效的返回语句(或显式抛出的异常)结束,它会遇到错误。阅读更多。甚至 ...int method() {&nbsp; &nbsp; if (true)&nbsp; &nbsp; &nbsp; &nbsp; return 1;}...将无法编译This method must return a result of type int

翻翻过去那场雪

两个建议 1. 最好不要更改您传递的参数(在这种情况下为 number 变量) 2. 尽可能少的 return 语句。在您的情况下,您可以在 for-lopp 之外声明另一个变量 tempNumber 并分配“数字”。在您返回的 if 条件下,您“中断”。返回函数末尾的数字。这样总是返回数字public static int getLargestPrime(int number) {&nbsp; &nbsp; if (number < 2) {&nbsp; &nbsp; &nbsp; &nbsp; return -1;&nbsp; &nbsp; }&nbsp; &nbsp; int tempNumber = number;&nbsp; &nbsp; for (int num = 2; num <= tempNumber; num++) {&nbsp; &nbsp; &nbsp; &nbsp; int mod = tempNumber % num;&nbsp; &nbsp; &nbsp; &nbsp; if (mod == 0) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int div = tempNumber / num;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (div == 1) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tempNumber = div;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; num = 1;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return tempNumber;}

达令说

https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.14Java 编译器不会在循环中验证您的代码,因此您需要将 return 语句放在所有 fork 中。覆盖测试会警告你,因为你有一个无法访问的代码,所以你需要重新规划你的代码。注意:您需要检查您的主要测试直到或等于Math.sqrt(number),如果大于此 sqrt 而没有分隔符,您可以打破循环并返回number
随时随地看视频慕课网APP

相关分类

Java
我要回答