2012-03-21 5 views
1

改善されたforループで作業を開始しました。その理由は、ArrayListsを使用するのがベストプラクティスと妥当性のためです。拡張forループで例外を捕捉し、このループのプロセスを再開するにはどうすればよいですか?

私のコードは、基本的に曲へのリンクを含むArrayListを取得し、このリストを解析して曲をダウンロードします。スローされる例外の1つはTimeoutExceptionです。通常、サーバーに過負荷がかかったり、インターネット接続が不安定になったりすると発生します。明確にするため

try 
{ 
    for(Track track : album.getTracks()) 
    { 
     songdown.downloadTrack(track, directorio, formataudio); 
    } 
} 
catch (TimeoutException te) 
{ 
    System.out.println("Timeout!"); 
} 

トラックsongdown.downloadTrack機能によって一枚ずつ解析さwhitchのArrayListです。ダウンロードに失敗した場合、TimeoutExceptionが発生しますが、この例外を処理して、生成したファイルを削除し、同じトラックからfor文を再起動してダウンロードを再開できるようにする方法はわかりません。

答えて

6

これがどのようなことがお勧めであるかは分かりませんが、成功するまで内部ループを再試行する方がよいでしょう。このような何か:

for (Track track : album.getTracks()) { 
    boolean downloaded = false; 
    while (!downloaded) { 
     try { 
      songdown.downloadTrack(track, directorio, formataudio); 
      downloaded = true; 
     } catch (TimeoutException te) { /* delete partially downloaded song etc */ } 
    } 
} 

あなたはおそらく無限ループを避けるために、ループまたは他のいくつかの追加チェックのための各反復内での再試行の最大#をしたいと思います。

+0

これは優雅なソリューションのようですが、私の唯一の疑問は、songdown.downloadtrackがTimeoutExceptionを返すと、私がこの例外を処理すると、コードは途中から再開され、ダウンロードされた= trueになるのでダウンロードしませんもう一度、ファイルですか? –

+1

いいえ、 'songdown.downloadTrack'はTimeoutExceptionを"返す "のではなく、残りの' try'ブロック( 'downloaded = true;')をスキップして ' catch 'ブロックを通過し、内側' while'ループの先頭に戻り、本質的に、同じ 'track'オブジェクト上の外側' for'ループの繰り返しを繰り返します。 –

+0

ご清聴ありがとうございます。 –

0

最初にthisまで行ってください。最初に、tryブロックが完了したらcatchブロックを開始する必要があります。

catchブロックで例外をキャッチして、例外が発生したときに実行するコードを書き直します。この場合は、最初からやり直しています。ダウンロードした半分のファイルを削除します。

0

確かに多くの有効なアプローチがあります。

ここでは一つの可能​​性だ。ここでは

int failureCount = 0; 

while (failureCount < maxFailures) { 
    try { 
     parseAndDownload(someList);  
     break; 
    } 
    catch (Exception ex) { 
     failureCount ++; 
    } 
} 
0

は、スニペットの例ですが、私はあなたがこのスニペットでは、このよう

ArrayList<String> a = new ArrayList<String>(); 
    a.add("a"); 
    a.add("w"); 
    a.add("d"); 
    //Iterator<String> i = a.iterator(); 
    for(String s:a){ 
     try{ 
      if(s.equals("w")){ 
       throw new Exception("Hello"); 
      }else{ 
       System.out.println(s); 
      } 
     }catch (Exception e) { 
      continue; 

     } 
    } 

に従うことによって、あなたの問題を解決することができると思い、私は明示的に例外をスローしています、それがスローされるとcatchブロックが実行されます。キーワードを続けて使用しました。です。このキーワードは、この種の状況に対処するために設計されています。

関連する問題