我在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
可以是ASSESSED
或NOT_ASSESSED
。
班级getStatus
中的Answer
方法只返回状态,没有别的。
答案 0 :(得分:2)
我调试了上面的代码,并且 ans.getStatus()返回 AnswerStatus.ASSESSED。仍然,如果 line返回true,并设置evaluate 为假。
但是,我认为最重要的是 奇怪;当我宣布 AnswerStatus stat变量,它有效, 即使我不使用stat变量 在if测试中。有人能告诉我吗 发生了什么事??
这听起来像getStatus()
方法并不总是返回相同的结果 - 它是如何实现的?
答案 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。