Returning null in a method that accounts for multiple conditions
考虑以下方法:
1 2 3 4 5 6 7 8 9 | private static String method (String string) { if (string.equals("conditionOne")) { return value; } else if (string.equals("conditionTwo")) { return symbol; } else { return null; } } |
假设我正在检查两个条件,
编辑:为了清楚起见,如果我不包括最后一个
谢谢
您在编程时描述了一个非常常见的场景。您希望某件事情永远不会发生,但编译器也知道它可能发生。处理这些代码路径的正确方法是确保它们永远不会到达,通常通过抛出
在您的情况下,我将抛出一个
1 2 3 4 5 6 7 8 | 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 +"'"); } |
现在,您可以确信这个函数将支持的唯一输入是它设计用来支持的输入。更好的是,任何不正确地调用方法的人都会得到一条清晰的、可操作的错误消息。
《番石榴用户指南》对不同类型的故障以及应何时提出故障有很好的概述。
您还可以通过定义更好的方法签名来避免这个问题。看起来您正在定义一个"字符串类型"API;使用枚举有助于防止调用方传入错误的参数。还可以看到有效的Java项目50和30。
在极少数情况下(通常在直接处理用户输入时),您希望软故障而不是快速故障。这在确认对话框中很常见;如果您要求用户输入"是"或"否",通常只需检查他们是否输入"是"-他们是否输入"否"或"uhhh",您只需将其视为不是-"是"。
你可以这样写:
1 2 3 4 5 6 | if (string.equals("conditionOne")) { return value; } else if (string.equals("conditionTwo")) { return symbol; } return""; |
或者像这样:
1 2 3 4 5 6 7 | string rval =""; if (string.equals("conditionOne")) { rval = value; } else if (string.equals("conditionTwo")) { rval = symbol; } return rval; |
或者像这样
1 2 3 4 5 6 | if (string.equals("conditionOne")) { return value; } else if (string.equals("conditionTwo")) { return symbol; } throw; |
编辑。
正如您将函数定义为返回字符串一样,使用
1 2 3 4 5 6 7 | if (string.equals("conditionOne")) { return value; } else if (string.equals("conditionTwo")) { return symbol; } else { return""; } |
如果已经保证字符串始终等于
它相当于添加不检查它是
编辑看到您的编辑,我建议您使用上述返回