2016-06-14 6 views
0

私のJava for loopチェックを続ける:addResult()は、いくつかのJava mapに結果を追加している場合は、カスタムメッセージを使用してJavaのスロー例外を交換して<code>ids() String[] array</code>に異なる<code>id</code>ため

BackTest.java

..... 
    for (String id: ids()) { 
     //..do something 
     addResult(result(id)); 
    } 

。ここでid does not exist場合、すなわちHTTP status!=200次のコードに示すように、私は新しい例外をスローしています:最初のIDであれば、

Api.Java私の最初のforループで今

...... 
    if (status != 200) { 
        String error = "No additional error message received"; 
        if (result != null && result instanceof JSONObject) { 
         JSONObject obj = (JSONObject) result; 
         if (obj.containsKey("error")) { 
          error = '"' + (String) obj.get("error") + '"'; 
         } 
        } 

        throw new ApiException(
          "API returned HTTP " + status + 
          "(" + error + ")" 
          ); 
     } 

ループdoes not exist、次に例外をスローして、my entire process to failとなり、further ids as a part of id arrayのチェックに失敗します。配列内の最初のIDで失敗しても、コードは引き続きIDを確認する必要がありますか?

throw new exceptionをtry-catchブロックに置き換えることができます。良い例があります。

+1

例外をキャッチして、 'try' /' catch'を使って例外を処理できます。それはあなたが求めていることですか? – immibis

+0

ええ、あなたは正しいです。 –

+0

それで 'try {addResult(result)};} catch(ApiException e){e.printStackTrace();}'? – immibis

答えて

2

そうした例外を処理できます。

for(String id : ids()) { 
    try { 
     addResult(result(id)); 
    } catch(ApiException e) { 
     System.err.println("Oops, something went wrong for ID "+id+"! Here's the stack trace:"); 
     e.printStackTrace(); 
    } 
} 

これは、この点を過ぎて伝播するため、ループを終了するのを中止し、例外をキャッチします、そして、それは代わりに、メッセージとスタックトレースを出力します。

0

新しい例外をスローするオーバーヘッドなしで残りのリスト/配列の処理を続行したい場合は、continueキーワードを使用します。

continueキーワードは、このような状況のために設計されています。これにより、プログラムの実行がすぐに最も近いループの先頭に戻り、その条件がテストされます。私は次のセットアップを使用することをお勧めします。

for(String id : ids()) { 

     //do stuff... 

     if(status != 200) { 
      //write to data logger, etc... 
      continue; 
     } 

     addResult(result(id)); 
    } 

一部

は汚いコードを生成することができ、それらのようにあまりにも多くの continueを使用して好きではありません。ただし、控えめに使用すると、ループ内のコード量を減らすのに役立ちます。

関連する問題