为什么else if在java中要求最后返回[duplicate]

3phpmpom  于 2023-01-04  发布在  Java
关注(0)|答案(2)|浏览(110)
    • 此问题在此处已有答案**:

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类型的结果"。请解释它的原因。

nwo49xxi

nwo49xxi1#

定义为返回int的函数在每条路径上都必须以return <int>结尾,如果没有最后的return a,就会出现没有返回值的情况(隐含地意味着它返回void)。
如果a为负,则第一个if或else都不会发生,因此最终不会返回任何结果。
编辑:同样,Java编译器也不能自己解决这个问题。例如,考虑下面的例子:

int foo(int a) {
    if (a < 0) return 0;
    if (a >= 0) return 1;
}

这段代码失败了,因为它认为foo在某些情况下不会返回int。事实并非如此,因为要么第一个if为真,要么第二个为真。a的值不足以使两个if语句都求值为false,但编译器不理解这一点。Swift中也发生了同样的事情。在C语言中(clang),则代码编译时会出现警告。

ippsafx7

ippsafx72#

如果我们分析方法和可能的参数值,我们会发现两个if-分支都没有涵盖a < 0的情况,因此需要无条件的return ...
如果我们要添加最后一个else if (...)来涵盖这种情况:

int fact(int a) {
  if (a == 0 || a == 1) {
    return 1;
  } else if (a > 1) {
    return ((a) * fact(a - 1));
  } else if (a < 0) {
    return a;
  }
}

Ideone.com demo
编译器仍将抱怨丢失返回,因为编译器不能推断覆盖了所有情况。
当最后一个case是else时(即“捕获所有”之前未检查的内容),情况会发生变化:

int fact(int a) {
  if (a == 0 || a == 1) {
    return 1;
  } else if (a > 1) {
    return ((a) * fact(a - 1));
  } else {
    return a;
  }
}

Ideone.com demo
不过话又说回来:我们可以只移除最后的else(但保留其主体),并得到原始代码。
关于代码的注解:在Java中,类名应该用UpperCamelCasepractice-〉Practice)来写

相关问题