2016-09-11 9 views
0

私はページのパスと次のページに言及するタグの名前クラスを与えるプログラムを作成しています。再帰関数が機能しません。

ここに私が試したコードです:

public String pagination_get_link(String path, String pagnNextLink_tag) throws IOException{ 
     Document doc = Jsoup.parse(new File(path), "UTF-8"); 
     Element url = doc.getElementById(pagnNextLink_tag); 
     String url_s = url.attr("href"); 
     pagination_get_link(url_s,pagnNextLink_tag); 

     return url_s; 

    } 

のページの例は、このようなページである:すべてのリンクを取得するまで、私は再帰的なメソッドを作りたい enter link description here

、そのループは、改ページ。 ありがとうございます。

+0

この再帰は決して停止しません。いくつかの条件が満たされている場合にのみ、再帰呼び出しを実行する必要があります。 –

答えて

1

あなたの再帰関数は永続的に動作し続けます。プログラムがスタックメモリを使い果たしてクラッシュしないようにします。要素が見つからないためにクラッシュしない場合は例外をキャッチしますこれは良いアイデアのように感じることはありません。

再帰的ループを作成するときは、結果を返さなければならず、関数 "done"が返された場合は、関数自体を再度呼び出さなくてはなりません。
つまり、処理するデータがもうない場合は、これを実行する必要があります。今は、クラッシュするまでループを実行し続けるだけです。

あなたのメソッドをどのように動作させるかはわかりませんが、正直なところ、このケースでは再帰が必要ないように思われます。通常のwhileループなどを使用することをお勧めします。


編集:

あなたが本当にあなたの再帰的なコードを使用したい場合は、url_sが空の場合は関数を呼び出す前に返すことはトリックを行う必要があり、何かのような...

public String pagination_get_link(String path, String pagnNextLink_tag) throws IOException{ 
    Document doc = Jsoup.parse(new File(path), "UTF-8"); 
    Element url = doc.getElementById(pagnNextLink_tag); 
    String url_s = url.attr("href"); 
    // Not sure how to check if its empty, so change it to what you need. 
    if(url_s == "") { 
     return ""; 
    } 
    pagination_get_link(url_s,pagnNextLink_tag); 

    return url_s; 
} 

今度は、IDやそれに類するもので要素を取得しようとすると例外がスローされる可能性があります。その場合、要素が存在するかどうか、または取得する前に「href」属性があるかどうかを確認します。そうではなく、ただその時点で戻ります。

また、結果から何もしないので、関数から文字列を返す必要はありません。それを無効にして、返信するときはただreturn;に変更してください。

+0

どのように私はループでそれをすることができます、実際に私は最近の前のページから得たすべてのurl_s thatsでこの機能を繰り返す必要があります。 url_sが最後に空になるまで – kivok94

+0

さて、 'url_s' varが空の場合に関数を再度呼び出す前に、あなたの現在の関数を修正することができます。通常のwhileループは同じですが、... while(url_s!= null) 'などのようにチェックします。 悪い私の答えはあなた自身の再帰関数を修正する方法を秒で更新:) – Jite

関連する問題