所以我建立了一种寻找素数的方法。它似乎只有当我强制将其标记为真时才有效。但是当我按照我的意愿离开它时,编译器不同意。
如何满足缺失的返回值错误?
private static boolean isPrime( int n)
// write a loop that sets a loop variable named divisor that goes from 2 to n/2
// in the loop call isFactor to see if divisor divides n evenly
// if it does print out that divisor followed by a space (no newline)
{
for (int divisor = 2; divisor <= n; divisor++)
{
boolean prime = true;
for (int i = 2; i < divisor; i++)
{
if (isFactor(n, divisor))
{
return false;
}
}
}
return true; // i just put this here so it would compile at all
}
答案 0 :(得分:2)
如果你的循环永远不会执行,你永远不会返回任何内容,而且你告诉Java你将返回某些东西,无论你的逻辑是否做了什么。
在方法内部的花括号之间查看代码,作为在程序生命周期内可能执行或不执行的块。如果删除整个for
块,则没有任何有效的返回语句,Java可以使用它来表示“是的,如果一切都失败了,那么我可以使用此值。”
也就是说,您的代码可以在一次运行中表现如下:
public boolean isPrime(int n) {
// outer for block is removed
}
...然后在另一场比赛中这样:
public boolean isPrime(int n) {
for (int divisor = 2; divisor <= n; divisor++) {
// inner for block is removed
}
}
......等等,直到你重建整个方法。
在上面的所有代码片段中,如果外部块和内部块都没有执行(并且通过扩展名,if
语句),那么您的程序不会在所有路径上返回任何内容。
这在Java Language Specification,§8.4.7:
中正式指定如果声明方法具有返回类型,则如果方法的主体可以正常完成(第14.1节),则会发生编译时错误。
换句话说,具有返回类型的方法必须仅使用提供值返回的return语句返回;它不允许“掉落身体的末端”。
答案 1 :(得分:1)
我不知道你的方法isFactor()
是如何工作的,这就是你应该怎么做的
private static boolean isPrime( int n)
{
boolean prime = true;
for (int divisor = 2; divisor <= n; divisor++)
{
for (int i = 2; i < divisor; i++)
{
if (isFactor(n, divisor))
{
prime =false;
}
}
}
return prime;
}
顺便说一句,我会像我这样简单地使用isPrime()
方法:
public static boolean isPrime(int n){
for(int i = 2 ; i < n ; i++){
if(n % i == 0){
return false;
}
}
return true;
}
答案 2 :(得分:0)
你也可以这样做。因为你在if条件中返回false,所以程序应该知道它是否不会进入if条件我应该返回什么。
private static boolean myMethod( int n)
boolean flag = true;
// some code here
flag = false;
// again some code here
flag = true
// Finally return the flag
return flag;
}
已编辑
在您的情况下,您可以像这样使用它
private static boolean isPrime( int n)
{
boolean flag = true;
for (int divisor = 2; divisor <= n; divisor++)
{
for (int i = 2; i < divisor; i++)
{
if (isFactor(n, divisor))
{
flag =false;
}
}
}
return flag;
}
答案 3 :(得分:0)
您的实现完全有效,但仅限于return true
语句。没有return true
语句,你的程序永远不会找到素数;它会正确识别数字不是素数,或者它不会返回任何东西。如果为n
传递了小于2的值,它也会决定不返回任何内容。值得庆幸的是,当你给出一个非void返回类型时,编译器不会让你决定不返回任何东西(除非你抛出一个异常,但那不是重点)。
所以编写代码的方式很好。您通过尝试查找除数来识别非素数,并在找到除数后立即返回。如果找不到,程序中的最后一个语句会声明通过消除过程找到的素数。但是,您将需要检查内部for循环。它不会更改传递给isFactor()的参数,因此它完全无关紧要。这样做效果也会更好:
private static boolean isPrime( int n)
// write a loop that sets a loop variable named divisor that goes from 2 to n/2
// in the loop call isFactor to see if divisor divides n evenly
// if it does print out that divisor followed by a space (no newline)
{
for (int divisor = 2; divisor <= n; divisor++)
{
if (isFactor(n, divisor))
{
return false;
}
}
return true; // i just put this here so it would compile at all
}