1

这可能是一个基本问题,通过代码更好地解释:

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

所以问题是,根据定义,我不知道所有可能影响状态的可能条件,并且我不希望编译器通过不初始化状态局部变量来抛出“我的未定义”错误。

底线是我的应用程序无法在状态设置为 UNKNOWN 的情况下工作,我刚刚将其设置为关闭编译器。

问题:我怎样才能优雅地处理这个问题,我考虑过在方法结束时抛出一个致命的异常,如果状态仍然设​​置为 UNKNOWN,但这感觉有点“丑陋”。

谢谢你。

4

4 回答 4

1

您可以将状态变量的某些默认值仅放在 else 条件中,以便如果任何if条件未通过,则至少 status 获得一些默认值。

于 2012-04-09T12:11:49.267 回答
1

我建议您尝试使用枚举而不是整数。

您的代码可以在 UNKNOWN 状态下工作 - 如果您正在编写 if/else if/else 或使用 switch 时的默认条件,那么这就是您从 else 子句返回的内容。

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

于 2012-04-09T12:13:25.773 回答
1

您可以断言或抛出异常。

http://docs.oracle.com/javase/1.4.2/docs/guide/lang/assert.html

于 2012-04-09T12:13:50.437 回答
1

我总是将 athrow放在链的末尾if / then / else,并且不预先将默认值分配给变量。如果抛出异常,它不仅告诉我应用程序无法继续,还会报告无法继续的原因。而且,一旦发现无法继续,它就会这样做,这对于错误报告来说是非常可取的(通常,您希望尽快报告错误)。

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

于 2012-04-09T12:14:51.420 回答