【问题标题】:Having return in every if & else if & else statements vs one return at the end of code在每个 if & else if 和 else 语句中都有 return 与在代码末尾有一个 return
【发布时间】:2021-02-08 06:22:07
【问题描述】:

您好,我有一个关于代码末尾的多个返回语句与单个返回语句的快速问题。

从第一个代码开始,对每个 if、else if 和 else 语句都使用了 return 语句,它给了我一个错误。而且我以为我涵盖了所有可能的情况,但它在下面给我一个错误。

错误: 缺少返回语句行:16

是什么导致了这个错误?另外,有什么方法可以改进我的第二个代码?

public int caughtSpeeding(int speed, boolean isBirthday) {
    if (!isBirthday)
        if (speed <= 60)
            return 0;
        else if (speed <= 80)
            return 1;
        else 
            return 2;
    if (isBirthday)
        if (speed <= 65)
            return 0;
        else if (speed <= 85)
            return 1;
        else 
            return 2;
}

从这第二个代码中,我能够摆脱错误。

public int caughtSpeeding(int speed, boolean isBirthday) {
    int flag = 0;
    if (!isBirthday)
        if (speed <= 60)
            flag = 0;
        else if (speed <= 80)
            flag = 1;
        else 
            flag = 2;
    if (isBirthday)
        if (speed <= 65)
            flag = 0;
        else if (speed <= 85)
            flag = 1;
        else 
            flag = 2;
        return flag;
}

【问题讨论】:

  • else替换if(isBirthday)
  • 没有大括号的嵌套 if 语句自找麻烦。帮助您自己和其他所有人阅读或维护您的代码并使用{}
  • 用 else 替换 if(isBirthday) 解决了问题!谢谢。我有我的 {} 用于我的 if 语句,但是当我将我的代码复制到这篇文章时错过了它。我的错。

标签: java if-statement return


【解决方案1】:

在您的第一个代码中,您测试isBirthday!isBirthday。 Java 不够聪明,无法看到这个列表是详尽无遗的。无论如何,你通常不会这样写:你会写else

public int caughtSpeeding(int speed, boolean isBirthday) {
    if (!isBirthday) {
        if (speed <= 60)
            return 0;
        else if (speed <= 80)
            return 1;
        else 
            return 2;
    } else {
        if (speed <= 65)
            return 0;
        else if (speed <= 85)
            return 1;
        else 
            return 2;
    }
}

另外,有什么方法可以改进我的第二个代码?

是的:使用第一个代码。第二个代码使用了一个完全冗余的变量。使用第一个代码。

事实上,因为第二个代码使用了一个变量,如果你忘记了一个 case,Java 不会警告你——它会默默地返回 0,因为 flag 就是这样初始化的。那将是一个错误。如果可能,编写不会导致错误但会触发编译错误的代码——这就是代码 1 所做的,因此会出现错误消息(在这种情况下是误报,但通常是正确的)。

【讨论】:

  • 为了防止静默返回 0,我应该更改 int flag = 0;到 int 标志 = -1; ??
  • @user13316090 不,变化很小。现在您的函数将静默返回-1。确实,您可以通过使用解决方案 1 而不是解决方案 2 来完全防止此类错误。
【解决方案2】:

嗯,对我们来说很明显,如果“如果生日”和“如果不是生日”将被执行,但 Java 编译器不这么认为。

如果第一个 'if' 没有被执行,而第二个 'if' 也没有被执行,那么你在没有执行 'return' 的情况下到达方法的结尾。

【讨论】:

    猜你喜欢
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    相关资源
    最近更新 更多