关于if语句:在考虑多个条件的方法中返回null

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;
    }
}

假设我正在检查两个条件,conditionOneconditionTwo。另外,假设程序的其他部分确保只有这两种情况会发生。由于该方法在所有情况下都必须返回某些内容以避免编译器错误,那么是否可以仅出于语法目的返回最终的else块的null,因为该部分永远不会执行?

编辑:为了清楚起见,如果我不包括最后一个else块,我想说明编译器会给我一个错误("expecting return语句")。除了返回空值(或空字符串,如下面Anthony所指出的那样),还有其他方法来编写这个方法以避免这种情况发生吗?

谢谢


您在编程时描述了一个非常常见的场景。您希望某件事情永远不会发生,但编译器也知道它可能发生。处理这些代码路径的正确方法是确保它们永远不会到达,通常通过抛出AssertionErrorRuntimeException,如IllegalArgumentExceptionIllegalStateExceptionUnsupportedOperationException。这被称为快速失败。

在您的情况下,我将抛出一个IllegalArgumentException,因为很明显发生了这种情况——您的方法只需要两个输入;其他任何东西都是禁止的,在这种情况下,您应该很快失败。有效的Java项目38也讨论了这一点。

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"";
}


如果已经保证字符串始终等于conditionOneconditionTwo,则不需要编写第3个else条件。

它相当于添加不检查它是conditionOne还是conditionTwo的代码。最好把它取下来。

编辑看到您的编辑,我建议您使用上述返回""的解决方案,因为它是一个字符串。