为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕慕森 2022-07-14 16:43:11
我正在编写一个函数,它给了我最大的因子,它是一个数字的质数。例如,数字 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语句?
查看完整描述

4 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

在您的初始代码中:


if (div == 1) {

    return number;

} else {

    number = div;

    num = 1;

}

                    }

万一你总是有错误,你将永远不会达到返回语句。编译器不预测它是否真的会发生,因此它需要在 if 和 else 块中都使用 return 语句。所以它实际上与for循环无关。


查看完整回答
反对 回复 2022-07-14
?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

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


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


return在编译时检查语句是否存在。如果编译器发现一个可能的执行分支没有以有效的返回语句(或显式抛出的异常)结束,它会遇到错误。阅读更多。


甚至 ...


int method() {

    if (true)

        return 1;

}

...将无法编译


This method must return a result of type int


查看完整回答
反对 回复 2022-07-14
?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

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


在您的情况下,您可以在 for-lopp 之外声明另一个变量 tempNumber 并分配“数字”。在您返回的 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;


}


查看完整回答
反对 回复 2022-07-14
?
达令说

TA贡献1821条经验 获得超6个赞

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

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

注意:您需要检查您的主要测试直到或等于Math.sqrt(number),如果大于此 sqrt 而没有分隔符,您可以打破循环并返回number


查看完整回答
反对 回复 2022-07-14
  • 4 回答
  • 0 关注
  • 142 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信