0

我从java开始,当我在写一种方法来识别一个数字是否是素数时,我写了一个这样的方法

public static boolean checkPrime(int n){

    int x = 2;

    while (((n % x) != 0) && (n > x)){
        x = x + 1;
    }

    if(((n % x) == 0) && (n == x)){     
        return !Prime;
    }
    else if(((n % x) == 0) && (n > x)){
        return Prime;
    }
    else {
        return Prime;
    }
}

我想不通的是最后一个 else 语句的必要性。如果我不输入,我会收到一条错误消息。但是我不认为这是必要的,因为所有可能性都被前面的循环所涵盖,以及它们尊重的返回语句。还是我错过了什么?

4

6 回答 6

2

你不需要其他的。编译器告诉您的是该方法必须返回一些东西。您的最后一个else块可以替换为:

return PrimeOrNot;

实际上,您的方法可能如下所示:

public static boolean checkPrime(int n){
    int x = 2;
    while (((n % x) != 0) && (n > x)){
        x = x + 1;
    }
    if(((n % x) == 0) && (n == x)){     
        return !(PrimeOrNot);
    }
    return (PrimeOrNot);
}

无论如何,您的最后一个语句块不能else if.

于 2013-06-08T02:31:57.283 回答
1

该方法的返回类型为布尔值。

编译器害怕没有满足任何“if”情况的可能性。在这种情况下,该方法知道要返回什么。这个方法需要返回一些东西,所以在方法结束之前给它一个'return true'。它永远不会被阅读,但它会让编译器高兴。

于 2013-06-08T02:34:10.643 回答
1

if/else-if 中的条件表达式仅在运行时进行评估。通常,编译器不会知道结果是什么,因为它们不会在编译时进行评估。if(true) {只有当它是某个编译时常量(如)时,编译器才能计算出表达式的结果的情况。

于 2013-06-08T02:38:58.567 回答
0

编译器仅检查您的方法是否有有效的返回路径。编译器不够“聪明”,无法检查条件语句并确定条件是否可以在逻辑上得到满足——编译器只是检查以确保返回一些值以遵守方法声明的约定。

有些人会争辩说,以下是该方法的更简洁的结构(但我认为这只是个人喜好问题):

public static boolean checkPrime(int n){
    int x = 2;
    while (((n % x) != 0) && (n > x)){
        x = x + 1;
    }

    if(((n % x) == 0) && (n == x)){     
        return !(PrimeOrNot);
    }

    return (PrimeOrNot);
}
于 2013-06-08T02:35:56.970 回答
0
public static boolean checkPrime(int n){
    boolean PrimeOrNot = false;
    int x = 2;

    while (((n % x) != 0) && (n > x)){
        x = x + 1;
    }

    if(((n % x) == 0) && (n == x)){     
        return !(PrimeOrNot);
    }
    else if(((n % x) == 0) && (n > x)){
        return (PrimeOrNot);
    }

    return PrimeOrNot;
}
于 2013-06-08T02:34:35.067 回答
0

如果返回值的方法在其所有可能的代码路径中返回值,则该方法将是可编译的。

想象一下,你是编译器。您会看到以下代码:

int myMethod()
{
    if (cond)
        return anInt;
}

虽然可能知道这cond实际上总是正确的,但编译器不会知道这一点。只有当它是一个只能在编译时计算的表达式时,它才能确定布尔表达式的结果。

请注意,Java 中的绝大多数“代码优化”实际上是在运行时完成的(JIT:Just In Time)。

于 2013-06-08T02:47:13.100 回答