在考虑多种情况的方法中返回空值。

16 浏览
0 Comments

在考虑多种情况的方法中返回空值。

考虑以下方法:

private static String method (String string) {
    if (string.equals("conditionOne")) {
        return value;
    } else if (string.equals("conditionTwo")) {
        return symbol;
    } else {
        return null;
    }
}

假设我正在检查两个条件,conditionOne和conditionTwo。另外,假设程序的某个其他部分确保只会发生这两种情况。由于该方法必须针对所有情况返回某些内容以避免编译器错误,因此在最终的else块中只为语法目的返回null是否可以?

编辑:为了明确起见,我想提到,如果我不包括最后一个else块,编译器会给我一个错误(“期望返回语句”)。除了返回null(或由Anthony以下指出的空字符串)外,是否有另一种方法编写此方法,以使不发生这种情况?

谢谢

admin 更改状态以发布 2023年5月20日
0
0 Comments

由于您定义的函数返回一个字符串,因此更正确的做法是:

if (string.equals("conditionOne")) {
    return value;
} else if (string.equals("conditionTwo")) {
    return symbol;
} else {
    return "";
}

0
0 Comments

您正在描述编程中非常常见的情况。您希望某件事永远不会发生,但编译器也知道它可能会发生。处理此类代码路径的正确方法是确保它们永远不会被触发,通常是抛出一个AssertionError或者一个 RuntimeException,例如IllegalArgumentExceptionIllegalStateExceptionUnsupportedOperationException。这被称为快速失败

在您的情况下,我会抛出一个IllegalArgumentException,因为这显然是发生的事情 - 您的方法只接受两个输入,任何其他输入都是禁止的,您应该在这种情况下进行快速失败。Effective Java Item 38同样讨论了这个问题。

private static String method (String condition) {
  if (condition.equals("conditionOne")) {
    return value;
  } else if (condition.equals("conditionTwo")) {
    return symbol;
  }
  throw new IllegalArgumentException("Invalid condition '" + condition +"'");
}

现在您可以确定此函数支持的唯一输入是它设计支持的那些。更好的是,任何以错误方式调用您的方法的人都将获得明确、可操作的错误信息。

Guava用户指南中有一个很好的不同类型的故障概述,以及应该何时引发它们。

您还可以通过其他方式避免这个问题 - 即通过定义更好的方法签名。看起来您正在定义一个"stringly-typed"API;使用枚举将有助于防止调用者传递错误的参数。另请参阅Effective Java Item 50和30。


在极少数情况下(通常是直接与用户输入打交道时),您可能希望进行软性失败而不是快速失败。这在确认对话框中很常见;如果您要求用户输入"Yes"或"No",通常只需检查他们是否输入了"Yes" - 无论他们是否输入了"No"或"Uhhhh"等,您都将对待它们为非"Yes"。

0