在考虑多种情况的方法中返回空值。
在考虑多种情况的方法中返回空值。
考虑以下方法:
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以下指出的空字符串)外,是否有另一种方法编写此方法,以使不发生这种情况?
谢谢
您正在描述编程中非常常见的情况。您希望某件事永远不会发生,但编译器也知道它可能会发生。处理此类代码路径的正确方法是确保它们永远不会被触发,通常是抛出一个AssertionError
或者一个 RuntimeException
,例如IllegalArgumentException
,IllegalStateException
或UnsupportedOperationException
。这被称为快速失败。
在您的情况下,我会抛出一个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"。