2017-08-11 5 views
-1

再帰関数を使用しているときにjava.lang.StackOverflowErrorを取得しています。Javaコードの変更でStackOverflowErrorを解決する方法

実際に再帰関数では、xmlファイルが解析され、xmlファイル内に以前のxmlフィードURLが存在する場合、そのxmlは同じ関数に再び渡され、このxmlファイルで再び前のxmlフィードURLが存在し、 。

このプロセスは、以前のXMLフィードURLが取得されるまで続きます。私は10,000ファイルのエラーを取得していませんが、その後同じ関数呼び出しが10,001番目のファイルに対して発生した場合、java.lang.StackOverflowErrorを取得しています。私はコーディングの変更でこのエラーを解決し、メモリを増やすことではなく、固定バッチサイズの再帰呼び出しのようにソリューションを実装しようとします。

あなたに私にStackOverflowErrorのより良い解決策を提供できるかどうか教えてください。この種のソリューションを実装する場合は、ソリューションコードの一部を要求されます。

よろしく、あなたのコードの記述として Shobhit

+0

この再帰呼び出しを実行するときに、すべてのStreamsを開いた状態にしていますか?私が読んだところでは、見つかったファイルをたどるので、以前のXMLフィードが見つかると常に現在のストリームを閉じることができるように思えます。 – Nico

+0

スタックオーバーフローは、ネストされたメソッド呼び出しをあまりにも多く作成し、再帰的なコードでは一般的な場合に発生します(一般的に私はそう思います)。したがって、あなたの再帰を明確にしてください。終了するベースケースがあることを確認してください。 – Adeel

+0

これを読んでくださいhttp://www.javaworld.com/article/2072881/diagnosing-and-resolving-stackoverflowerror.htmlリンク –

答えて

0

今のところ、try/catchブロックを使用して問題を修正しました。私はStackOverflowErrorを捕まえ、メモリ内で最後に処理されたファイルを格納します。次に、メソッドを再度呼び出して、StackOverflowErrorが発生したファイルから開始します。

更新: 今、私はStackOverFlowErrorのより良いソリューションを実装しました。私は構成可能なサイズのバッチでプロセスを実行しています。たとえば、プロセスは100サイズのバッチで処理され、さらに処理が必要な場合は、次のバッチになります。

1

一般的な答えは少しあいまいです:あなたが割り当てられたよりも多くのスタックを必要とするとき

にStackOverflowErrorが起こる - それは些細なのです。ネストされたメソッド呼び出しのスタック内では、再帰的であるかどうかにかかわらず、すべてのメソッド呼び出しには、メソッドのパラメータとローカル変数の数によって決まるスタック量が必要です。したがって、スタック要件を減らすために、ネストされたメソッド呼び出しの数を減らすか、メソッド内のパラメータおよびローカルが少なくて済むようにすることができます。両方ともあなたのソフトウェアの再設計が必要です。

再帰呼び出しは特に危険です。多くのネストされた再帰呼び出しが何回起こるかを事前に知ることができない場合、StackOverflowErrorを取得するリスクは非常に高いです。

あなたの説明は、URLとリンクによって形成されるグラフの深さ優先検索(再帰によって実装)のように少し聞こえます。幅優先検索(通常は反復によって実装されています)に変更することができれば、StackOverflowの理由はもうありません。もちろん、どちらの検索でも終了条件が必要なので、永遠にサイクルに巻き込まれることはありません。

関連する問題