奇怪的java枚举错误

时间:2009-01-20 14:02:56

标签: java enums

我在Java中有一个非常奇怪的枚举错误。

for(Answer ans : assessmentResult.getAnswersAsList()) { //originally stored in a table
    //AnswerStatus stat = ans.getStatus();
    if (ans.getStatus() == AnswerStatus.NOT_ASSESSED) {
        assessed = false;
    }
}

答案是对测试问题的回答。评估结果是学生参加考试的结果(包括答案​​集合)。

我调试了上述代码,ans.getStatus()返回AnswerStatus.ASSESSED。 仍然,if行返回true,并且evaluate被设置为false。

但是,我觉得这个问题最奇怪;当我声明AnswerStatus stat变量时,即使我在if测试中不使用stat变量,它也可以工作。有人能告诉我发生了什么事吗?

我已经阅读了有关序列化/ RMI-IIOP中的枚举错误的内容,但我不在此处使用它。 enum AnswerStatus可以是ASSESSEDNOT_ASSESSED

班级getStatus中的Answer方法只返回状态,没有别的。

4 个答案:

答案 0 :(得分:2)

  

我调试了上面的代码,并且   ans.getStatus()返回   AnswerStatus.ASSESSED。仍然,如果   line返回true,并设置evaluate   为假。

     

但是,我认为最重要的是   奇怪;当我宣布   AnswerStatus stat变量,它有效,   即使我不使用stat变量   在if测试中。有人能告诉我吗   发生了什么事??

这听起来像getStatus()方法并不总是返回相同的结果 - 它是如何实现的?

顺便说一句,拥有值为ASSESSED和NOT_ASSESSED的枚举是什么意思?为什么不使用布尔值isAssessed()?

答案 1 :(得分:2)

解决。

NetBeans调试器欺骗了我。它没有通过if测试(虽然NetBeans说的)。

很抱歉给您带来不便: - )

答案 2 :(得分:1)

如果使用.equals而不是==?

会发生什么

答案 3 :(得分:-4)

没有回答你的问题而是建议:

最好将fix枚举值放在compare语句的第一位,将变量part放在第二位。因为,如果在任何情况下变量部分传递NULL,您将不会得到NullPointerException。

在您的示例中,它将如下所示

...
if (AnswerStatus.NOT_ASSESSED == ans.getStatus())
...

<强> MISTAKE:

当然,我犯了一个错误,互相混淆了两件事。如果使用equals方法将固定的枚举值与包含此枚举的变量进行比较,则可以将常量枚举值与变量进行比较,而不是相反。例如:

if (AnswerStatus.NOT_ASSESSED.equals(ans.getStatus()))

而不是

if (ans.getStatus().equals(AnswerStatus.NOT_ASSESSED))

因为如果ans.getStatus()== null,这可能会损害NullPointerException。