2016-06-14 28 views
0

Meine Java for loop Kontrollen für verschiedene id in ids() String[] array als:Java Ersetzen durch benutzerdefinierte Nachricht throw Ausnahme und weiter

BackTest.java

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

wo addResult() ist das Ergebnis einiger Java map hinzufügen. Hier, wenn der id does not exist, dh http status!=200 dann habe ich eine neue Ausnahme werfe wie im folgenden Ausschnitt gezeigt:

Api.Java

...... 
    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 + ")" 
          ); 
     } 

Jetzt in meinem ersten for Schleife, wenn die erste ID in die Schleife does not exist, dann werfe ich eine Ausnahme und das macht my entire process to fail und es schlägt fehl, um die further ids as a part of id array zu überprüfen. Wie stelle ich sicher, dass, selbst wenn es bei der ersten ID in einem Array fehlschlägt, der Code weiterhin nach weiteren IDs suchen sollte?

Ich kann throw new exception mit try-catch-Block ersetzen. Ein Beispiel wäre gut.

+1

Sie können Ausnahmen abfangen und mit 'try' /' catch' umgehen. Ist es das, was du fragst? – immibis

+0

Ja, du hast Recht. –

+0

Also: 'try {addResult (Ergebnis (id));} catch (ApiException e) {e.printStackTrace();}'? – immibis

Antwort

2

Sie können eine Ausnahme so behandeln;

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(); 
    } 
} 

Dies wird die Ausnahme, fangen, die sie an der Ausbreitung über diesen Punkt stoppt und damit die Schleife endet, und es wird eine Mitteilung und die Stack-Trace statt drucken.

0

Wenn Sie den Rest Ihrer Liste/Array ohne den Overhead einer neuen Ausnahme weiter verarbeiten möchten, dann würde ich das Schlüsselwort continue verwenden.

Das Schlüsselwort continue wurde für solche Situationen entwickelt. Es bewirkt, dass die Ausführung des Programms sofort zum Anfang der nächsten Schleife zurückkehrt und seinen Zustand testet. Ich würde vorschlagen, das folgende Setup zu verwenden.

for(String id : ids()) { 

     //do stuff... 

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

     addResult(result(id)); 
    } 

Einige mögen nicht continue als zu viele von ihnen mit unordentlichen Code erzeugen kann. Wenn sie jedoch sparsam verwendet werden, können sie helfen, die Menge an Code innerhalb einer Schleife zu reduzieren.