我从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;
}
}
我无法弄清楚最后一句话的必要性。如果我不把它,我收到一条错误信息。但是我不认为这是必要的,因为前面的循环涵盖了所有可能性,以及它们尊重的返回语句。或者我错过了什么?
答案 0 :(得分:2)
你不需要别的。编译器告诉你的是方法必须返回SOMETHING。您的上一个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
。
答案 1 :(得分:1)
该方法的返回类型为boolean。
编译器害怕没有满足'if'案例的可能性。在这种情况下,该方法知道要返回什么。这个方法需要返回一些东西,所以在方法结束之前给它一个'return true'。它永远不会被阅读,但它会使编译器满意。
答案 2 :(得分:1)
if / else-if中的条件表达式仅在运行时进行计算。通常,编译器不知道结果是什么,因为它们不在编译时进行评估。只有,当编译器可以计算出表达式的结果是什么时,它是一些编译时常量(如if(true) {
)。
答案 3 :(得分: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;
}
答案 4 :(得分: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);
}
答案 5 :(得分:0)
如果在所有可能的代码路径中返回值,则返回值的方法将是可编译的。
想象一下你是编译器。你看到这段代码:
int myMethod()
{
if (cond)
return anInt;
}
虽然你可能知道cond
实际上始终为真,但编译器会不知道这一点。如果它是一个只能在编译时计算的表达式,它只能确定布尔表达式的结果。
请注意,Java中的绝大多数“代码优化”实际上是在运行时完成的(JIT:Just In Time)。