为什么需要这个退货声明?

时间:2013-03-29 22:56:40

标签: java if-statement return

这是“Absolute Java”一书中的一种方法。我不明白为什么最后一个else语句需要返回值为0.作者的评论是“需要保持编译器满意”。有没有理由返回值是0,还是可以是任何整数?

public int getMonth( )
{
    if (month.equals("January"))
        return 1;
    else if (month.equals("February"))
        return 2;
    else if (month.equalsIgnoreCase("March"))
        return 3;
    else if (month.equalsIgnoreCase("April"))
        return 4;
    else if (month.equalsIgnoreCase("May"))
        return 5;
    else if (month.equals("June"))
        return 6;
    else if (month.equalsIgnoreCase("July"))
        return 7;
    else if (month.equalsIgnoreCase("August"))
        return 8;
    else if (month.equalsIgnoreCase("September"))
        return 9;
    else if (month.equalsIgnoreCase("October"))
        return 10;
    else if (month.equals("November"))
        return 11;
    else if (month.equals("December"))
        return 12;
    else
    {
        System.out.println("Fatal Error");
        System.exit(0);
        return 0; //Needed to keep the compiler happy
    }
}

3 个答案:

答案 0 :(得分:8)

我认为这对程序员来说是糟糕的设计,但它很简单并且我认为完成了工作。也许这本书提供了更多关于这个例子的背景?也许他们用这个来说明语言而不是实际解决问题?因为这是控制应用程序中逻辑流的一种不好的方法。

运行时,应用程序将在此处结束:

System.exit(0);

但编译器不知道这一点。编译器看到此函数返回int并要求所有代码路径返回一个值。即使其中一个代码路径在运行时也会以另一种方式退出该函数。因此,最后一个代码路径需要返回一个值:

return 0;

当然可以是任何整数。开发人员选择0因为它很容易,但它基本上是任意的。在运行时,将无法到达该行。

答案 1 :(得分:3)

如果方法返回值,编译器将测试每个可能的执行路径以查看是否返回值。如果不是这种情况,则会引发编译时错误。

它将查看被调用的方法,以查看它是否退出应用程序或其他内容。从编译器的角度来看,System.exit()只是一个方法调用,就像任何其他方法一样。如果没有return 0;语句,该方法将不会返回该执行路径的值,这是非法的。即使它在实践中永远不会被执行。

答案 2 :(得分:0)

更好

    System.exit(0);
    throw new AssertionError("won't reach here");