2016-10-21 10 views
-2

ちょっと好奇心が強い、私はこのコードを書きました(私はそれが悪いコードであることを知っています、私は以来それを置き換えています)。 DocumentTreeNodeのtoStringメソッドです。これはforループで再帰的に呼び出されたことを意味します(私が言ったように、悪い考えです)。面白いことに、子供のセットが空になったときに掛かっていたのですが、誰もその理由を説明できますか?空リスト上のループがハングアップするのはなぜですか?

注:childrenあなたは、そのtoStringを呼び出しtoString表現にparentを追加

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

*本当に*空であれば、それは起こりません。強化されたforループは、 'children.values()。iterator()。hasNext()'が直ちにfalseであることを見つけるでしょう。私は実際には 'toString()'メソッドへの意図しない再帰呼び出しであることを期待します。つまり 'this.parent'、' this.key'、 'this.value'は' this'です。 –

+0

長さが0の配列に対する拡張された 'for'ループまたは空の' Iterable'はハングしません。コントロールはループ本体のゼロ反復を実行して通過します。 –

+1

実際、私はそれが再帰的呼び出しではないと思います - それは 'StackOverflowError'で合理的にすばやく失敗するでしょう。 –

答えて

2

空のこのケースでは、TreeSetのです。次に、その子にはtoStringが呼び出されます。それぞれの子は、そのメソッドを親に対して再度呼び出します。無限ループがあります。

Upd。私はすぐにstackoverflowのようなもので死ぬことを期待していますが。私は、デバッガでこれを実行し、提案された仮説を検証するコードをステップ実行することをお勧めします。

関連する問題