- 此问题在此处已有答案**:
Missing return statement for if/else statement(8个答案)
2天前关闭。
我下面提到的程序不与else if一起工作,而与else一起工作。万一else if我最后不得不返回。
public class practice {
int fact(int a) {
if (a == 0 || a == 1) {
return 1;
} else if (a > 1) {
return ((a) * fact(a - 1));
}
return a;
}
public static void main(String[] args) {
practice result = new practice();
System.out.println(result.fact(5));
}
}
这运行正常,结果是fact(5)= 120,但是当我移除return a;它说-"这个方法必须返回一个int类型的结果"。请解释它的原因。
2条答案
按热度按时间nwo49xxi1#
定义为返回int的函数在每条路径上都必须以
return <int>
结尾,如果没有最后的return a
,就会出现没有返回值的情况(隐含地意味着它返回void
)。如果
a
为负,则第一个if或else都不会发生,因此最终不会返回任何结果。编辑:同样,Java编译器也不能自己解决这个问题。例如,考虑下面的例子:
这段代码失败了,因为它认为
foo
在某些情况下不会返回int。事实并非如此,因为要么第一个if为真,要么第二个为真。a
的值不足以使两个if
语句都求值为false,但编译器不理解这一点。Swift中也发生了同样的事情。在C语言中(clang),则代码编译时会出现警告。ippsafx72#
如果我们分析方法和可能的参数值,我们会发现两个
if
-分支都没有涵盖a < 0
的情况,因此需要无条件的return ...
。如果我们要添加最后一个
else if (...)
来涵盖这种情况:Ideone.com
demo编译器仍将抱怨丢失返回,因为编译器不能推断覆盖了所有情况。
当最后一个case是
else
时(即“捕获所有”之前未检查的内容),情况会发生变化:Ideone.com
demo不过话又说回来:我们可以只移除最后的
else
(但保留其主体),并得到原始代码。关于代码的注解:在Java中,类名应该用
UpperCamelCase
(practice
-〉Practice
)来写