【问题标题】:Why is this return statement needed? [duplicate]为什么需要这个返回语句? [复制]
【发布时间】:2013-03-20 17:06:08
【问题描述】:

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

【问题讨论】:

  • 这对我来说有点味道——扔一个Exception;其他东西应该exit。最好什么都没有……

标签: java if-statement return


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    System.exit(0);
    

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

    return 0;
    

    当然,它可以是任何整数。开发人员选择了0,因为它很简单,但本质上是任意的。在运行时将不会到达该行。

    【讨论】:

    • @bmorris591:谢谢 :) 我听说有人将异常用于控制流,但我从未听说过将应用程序事件用于控制流。
    【解决方案3】:

    更好

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

    【讨论】:

      猜你喜欢
      • 2013-11-29
      • 2017-05-10
      • 2016-02-20
      • 1970-01-01
      • 2015-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-10
      相关资源
      最近更新 更多