【发布时间】:2019-03-01 08:13:18
【问题描述】:
我正在编写一个函数,它给了我最大的因子,它是一个数的质数。例如,数字 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语句?
【问题讨论】:
-
你可以,但是你需要为所有场景的返回语句,这也意味着当迭代不循环时。
-
我建议添加新变量,例如 returnValue ,您将在需要的每个地方设置它,并且在此函数末尾的所有循环都返回此值
-
例如,你永远不会进入 if for "div == 1" 的理论案例。如果这种情况以某种方式发生,您将永远不会返回,因此需要在 for 循环之后返回。这种情况可能永远不会出现,但编译器不知道,所以这就是你在 for 循环之后返回语句的原因。你也可以只抛出一个专门的异常而不是返回数字。
-
如果你在 else case 或者在循环之外,你应该返回一些 int i。返回 0;
-
如果您确定在循环中的某个时间会返回一个值,请在方法底部添加
throw new AssertionError("Never ending here");。这将使编译器满意并且没有效果(除非您的假设中断)。
标签: java