1

这是《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
    }
}
4

3 回答 3

8

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

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

System.exit(0);

But the compiler doesn't know that. The compiler sees this function returns an int and demands that all code paths return a value. Even if one of the code paths will, at runtime, exit the function in another way. So that last code path needs to return a value:

return 0;

It can be any integer, of course. The developer picked 0 because it's easy, but it's essentially arbitrary. At runtime that line won't be reached.

于 2013-03-29T23:00:16.860 回答
3

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

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

于 2013-03-29T22:59:52.163 回答
0

better yet

    System.exit(0);
    throw new AssertionError("won't reach here");
于 2013-03-29T23:47:42.617 回答