2013-12-02 2 views
0

У меня есть ошибка действительно действительно странная с Java здесь!Ошибка при отклонении оператора if в java-программе

У меня есть LinkedList с размером три, и когда я сравниваю его с нулем, он оценивается как True! Почему, ради бога, это происходит !?

Код:

long depth = 0; 
    long initial = System.currentTimeMillis(); 

    OthelloStateNode root = new OthelloStateNode(_state); 

    List<OthelloStateNode> children = root.generateChildren(); 

    System.out.println("SIZE: " + children.size()); 

    if (children.isEmpty()) { 
     return null; 
    } 

Функция generateChildren():

 public List<OthelloStateNode> generateChildren() { 
      // expand children, if necessary 
      if (children == null) { 
       children = new LinkedList<>(); 
       for (OthelloMove move : state.generateMoves()) { 
        OthelloStateNode child = new OthelloStateNode(state.applyMoveCloning(move)); 
        child.movement = move; 
        child.parent = this; 

        children.add(child); 
       } 
      } 
      return children; 
     } 

Выход println является "Размер: 3"! Нет причин для этого быть True.

По-видимому, если я удаляю System.currentTimeMillis(), он работает правильно ... Но это не должно быть связано с вопросом, если 3 равно 0 или нет, не так ли?

Кто-нибудь знает об этом? Вот код, если вы хотите, чтобы загрузить и протестировать, если это также происходит в вашей машине: https://docs.google.com/file/d/0Bxl_AQ6nM3yXVnAzdXg5MFUtVTg/edit

screenshot

+2

Он возвращает true или возвращает null? Здесь нет возврата. –

+2

Я готов сделать ставку на то, что это не ошибка Java. –

+0

Можем ли мы определить определение класса OthelloStateNode и метод generateChildren()? –

ответ

3

Я думаю, этот вопрос, безусловно, относится к «серой зоне», потому что из фрагмента коды» что он просто не может произойти - связанный список определенно работает и не имеет ошибки, на которую вы можете положиться. Таким образом, самая очевидная причина, по которой мы не можем дать ответ, состоит в том, что у нас недостаточно информации об этом.

Теперь вы сказали что-то «интересное» или, по крайней мере, подозрительное, - когда вы удаляете измерение времени, оно работает. Иногда это может произойти, когда вы используете несколько потоков, и один поток каким-то образом изменяет внутреннее состояние списка. Например: thread A получить ссылку на List, который имеет 3 элемента в момент t1. Резьба B также имеет такую ​​же ссылку. Thread B изменяет состояние списка в момент времени t2 (t2> t1), поток A не имеет понятия об этом, он просто держит ссылку и занят своей собственной работой. В момент времени t3 (t3> t2) Thread A доступ к списку и, очевидно, его уже изменилось.

Это одна из возможных причин увидеть такое поведение.

Другое направление копаться :)

Вы пытались запустить это в командной строке в «старому» без IDE? Иногда (я допускаю очень редко и при удаленной отладке в основном) такое может случиться, потому что ваши источники не синхронизированы с тем, что считает отладчик. Это может быть решено путем вычистки вы скомпилированных классов и восстановления всех. Я знаю, что это вряд ли станет причиной, но стоит упомянуть.

Надеюсь, что это поможет как-то

+0

Да. Я подумал об этом, но у меня не больше одного потока. О, нет .. Я этого не делал. Я попробую это, спасибо. :-) – ldavid

Смежные вопросы