如何妥善处理默认变量的值是不正确

问题描述:

这可能是一个基本的问题,通过代码更好地解释:如何妥善处理默认变量的值是不正确

public void checkStatus { 
     int status = UNKNOWN; 
     if (somecondition) { 
      status = STATUS_UP; 
     } elseif (someothercondition) { 
      status = STATUS_DOWN; 
     } 
    } 

所以问题是,按照定义,我不知道所有可能的情况,可能影响STATUS,我不希望编译器通过不初始化状态局部变量来抛出“我的未定义”错误。

底线我的应用程序无法使用状态设置为UNKNOWN,我刚刚设置它来关闭编译器。

问题:我如何优雅地处理这个问题,我认为如果状态仍然设​​置为UNKNOWN,那么在方法结尾处抛出一个致命异常,但感觉有点“难看”。

谢谢。

+2

如果您的应用程序根本无法处理该情况,那么投掷声音非常合理。 – Mat 2012-04-09 12:08:42

+1

如果您的应用程序无法正常工作,那么最好的办法是通过抛出相应的异常来通知客户端,而不是等待事情稍后中断。 – Dan 2012-04-09 12:11:27

+1

当您的条件为假时,不会抛出任何'异常'也,你会怎么做?答案是:您必须选择以下两种方法之一。 – MJM 2012-04-09 12:11:49

我总是把throwif/then/else链的末端,不分配默认值的变量前期。如果抛出异常,它不仅告诉我应用程序无法继续,而且还会报告它无法继续执行的原因。此外,它一旦发现它不能继续进行,这对于错误报告是非常理想的(通常,您希望尽快报告错误)。

有一个特殊的情况,当你构建你的代码,这样的方式的somecondition S中的组合是这样的,你从未跑出if/then/else链的尾部,但是编译器不能自动验证。例如,您之前验证了输入,并且您知道代码中没有可以更改它的路径。在这种特定情况下,您应该使用断言而不是抛出异常,因为它表明您的代码推理存在错误,而不是简单的编码错误。

您可以将状态变量的某些默认值置于其他条件中,以便如果任何if条件未通过,则至少状态将获得某个默认值。

我建议你尝试一个枚举而不是整数。

您的代码可以使用UNKNOWN状态 - 如果您正在编写if/else if/else或者使用开关时的默认情况,那么您将从else子句返回。

抛出异常也可以。这是您的设计选择。如果未知状态确实是特殊情况,您应该使用例外。如果这很常见,我会倾向于枚举。