Просто быстрое любопытство, я написал этот бит кода (я знаю, что это плохой код, я его заменил с тех пор). Это метод 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();
}
Если это действительно * пусто, этого не происходит. В цикле расширенного цикла будет найдено, что 'children.values (). Итератор(). HasNext()' немедленно ошибочно. Я бы ожидал, что это фактически непреднамеренный рекурсивный вызов этого метода 'toString()', то есть один из 'this.parent',' this.key', 'this.value' равен' this'. –
Усовершенствованный цикл 'for' над массивом нулевой длины или пустой' Iterable' не зависает. Контроль просто проходит через нулевые итерации тела цикла. –
На самом деле, я не думаю, что это рекурсивный вызов - это может привести к ошибке с помощью 'StackOverflowError'. –