这可能是一个基本问题,通过代码更好地解释:
public void checkStatus {
int status = UNKNOWN;
if (somecondition) {
status = STATUS_UP;
} elseif (someothercondition) {
status = STATUS_DOWN;
}
}
所以问题是,根据定义,我不知道可能影响STATUS的所有可能条件,并且我不希望编译器通过不初始化status局部变量来抛出'my not be defined'错误。 / p>
底线我的应用程序无法使用状态设置为UNKNOWN,我只是将其设置为关闭编译器。
问题:如何优雅地处理这个问题,如果状态仍然设置为UNKNOWN,我已经考虑在方法结束时抛出一个致命的异常,但这感觉有点'难看'。
谢谢。
答案 0 :(得分:1)
你可以将status变量的某个默认值置于其他条件中,这样如果没有传递任何if
条件,那么at-least status会得到一些默认值。
答案 1 :(得分:1)
我建议您尝试枚举而不是整数。
你的代码可以使用UNKNOWN状态 - 如果你正在编写if / else if / else或者使用switch时的默认条件,那么你将从else子句返回。
抛出异常也可以。这是你的设计选择。如果未知状态确实是特殊情况,则应使用例外。如果它很常见,我会倾向于枚举。
答案 2 :(得分:1)
答案 3 :(得分:1)
我总是将throw
放在if / then / else
链的末尾,并且不要将默认值预先分配给变量。如果抛出异常,它不仅会告诉我应用程序无法继续,还会报告无法继续执行的原因。而且,一旦发现它无法继续,它就会这样做,这对于错误报告非常有用(通常,您希望尽快报告错误)。
有一种特殊情况,当您构建代码时,somecondition
s的组合使得永远不会从{{1}的尾部运行链,但编译器无法自动验证它。例如,您之前验证了输入,并且您知道代码中没有可以更改它的路径。在这种特定情况下,您应该使用断言而不是抛出异常,因为它表示您对代码的推理出错,而不是简单的编码错误。