Странная ошибка перечисления java - PullRequest
0 голосов
/ 20 января 2009

У меня действительно странная ошибка enum в 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, а для параметра оценке установлено значение false.

Но вещь, которая мне кажется наиболее странной; Когда я объявляю переменную AnswerStatus stat, она работает, даже если я не использую переменную stat в тесте if. Может ли кто-нибудь сказать мне, что происходит?

Я читал кое-что об ошибках enum в сериализации / RMI-IIOP, но я не использую это здесь. enum AnswerStatus может быть ASSESSED или NOT_ASSESSED.

Метод getStatus в классе Answer просто возвращает статус, ничего больше.

Ответы [ 4 ]

2 голосов
/ 20 января 2009

Я отлаживал приведенный выше код и ans.getStatus () возвращает AnswerStatus.ASSESSED. Тем не менее, если строка возвращает истину, и оценка установлена в ложь.

Но, на мой взгляд, больше всего странный; Когда я объявляю Переменная answerStatus stat, она работает, даже если я не использую переменную stat в тесте if. Может кто-нибудь сказать мне что происходит?

Похоже, что метод getStatus() не всегда возвращает один и тот же результат - как он реализован?

Кстати, какой смысл иметь перечисление со значениями ASSESSED и NOT_ASSESSED? Почему бы не использовать логическое значение isAsoted ()?

2 голосов
/ 20 января 2009

решаемая.

Меня обманул NetBeans. Он не проходит тест if (хотя NetBeans говорит об этом).

Приносим извинения за неудобства: -)

1 голос
/ 20 января 2009

Что произойдет, если вы используете .equals вместо ==?

0 голосов
/ 20 января 2009

Нет ответа на ваш вопрос, но есть предложение:

Всегда лучше поместить фиксированное значение перечисления на первое место в операторе сравнения, а переменную часть - на второе. Потому что, если в любом случае переменная часть выдаст NULL, вы не получите исключение NullPointerException.

В вашем примере это будет выглядеть так

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

ОШИБКА:

Конечно, я ошибаюсь и смешиваю две вещи друг с другом. Если вы используете метод equals для сравнения фиксированного значения перечисления с переменной, содержащей это перечисление, то лучше сравнить постоянное значение перечисления с переменной, а не наоборот. Например:

запись

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

вместо

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

потому что это может повредить исключение NullPointerException, если ans.getStatus () == null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...