2016-10-21 2 views
-2

Просто быстрое любопытство, я написал этот бит кода (я знаю, что это плохой код, я его заменил с тех пор). Это метод toString DocumentTreeNode, который означает, что он рекурсивно вызывается в цикле for (как я уже сказал, плохая идея). Интересный бит был виден, когда набор детей был пуст, может ли кто-нибудь объяснить, почему это произойдет?Зачем нужна петля над пустым списком?

Примечание: children является TreeSet, в этом случае пустого

public String toString() { 
    MoreObjects.ToStringHelper helper = 
      MoreObjects.toStringHelper(getClass()) 
      .add("parent", this.parent) 
      .add("key", this.key) 
      .add("value", this.value); 
    for (DocumentTreeNode<V> child : children.values()) { 
     helper = helper.add("child", child); 
    } 
    return helper.toString(); 
} 
+1

Если это действительно * пусто, этого не происходит. В цикле расширенного цикла будет найдено, что 'children.values ​​(). Итератор(). HasNext()' немедленно ошибочно. Я бы ожидал, что это фактически непреднамеренный рекурсивный вызов этого метода 'toString()', то есть один из 'this.parent',' this.key', 'this.value' равен' this'. –

+0

Усовершенствованный цикл 'for' над массивом нулевой длины или пустой' Iterable' не зависает. Контроль просто проходит через нулевые итерации тела цикла. –

+1

На самом деле, я не думаю, что это рекурсивный вызов - это может привести к ошибке с помощью 'StackOverflowError'. –

ответ

2

Вы добавляете parent в toString представления, которое вызывает его toString. В свою очередь, он вызывает toString на своих дочерних элементах, каждый из которых снова вызывает этот метод для родителя. У вас бесконечный цикл.

Обновление. Хотя я бы ожидал, что быстро умру с чем-то вроде stackoverflow. Я рекомендую вам запустить это в отладчике и выполнить код, чтобы проверить предложенную гипотезу.

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