2009-11-25 8 views
12

Sagen wir, ich kann eine Menge von Aussagen:Java: Versuch-Catch-Continue?

try { 
    String a = getProperty("a"); 
    String b = getProperty("b"); 
    String c = getProperty("c"); 
} catch(Exception e) { 

} 

Nun wurde sagen wir mal Eigenschaft b nicht gefunden und die Funktion eine Ausnahme auslöst. Wie würde ich in diesem Fall einfach fortfahren oder b auf null setzen, ohne für jede Eigenschaft einen try-catch-Block schreiben zu müssen? Ich meine, a, b, c existieren, aber manchmal werden sie überhaupt nicht gefunden, während denen eine Ausnahme ausgelöst wird.

Antwort

19

Angenommen, Sie können die Funktion nicht so ändern, dass sie null zurückgibt, wenn die Eigenschaft nicht gefunden wird. Sie stecken alles in einen eigenen try catch-Block - vor allem, wenn Sie für jeden Wert haben wollen abgerufen werden abgerufen (. im Gegensatz zu den ersten Wert zu lassen, der die gesamte Vorgang fehlschlägt abbrechen)

Wenn Sie viele dieser Eigenschaften haben abzurufen, vielleicht wäre es sauberer sein, eine Hilfsmethode zu schreiben zu verwenden:

String getPropertySafely(String key) { 
    try { 
     return getProperty(key); 
    } catch (Exception e) { 
     return null; 
    } 
} 
+0

Das sieht sehr interessant aus! Danke – Legend

+1

Ich würde es "getPropertyQuietly" nennen, nur weil sie diese Benennungskonvention in der Jakarta Commons IO verwenden (die Methoden closeQuietly in der IOUtils Klasse) –

+4

+1 Ravi - Ein großes Haustier ärgert mich schluckt Ausnahmen. Wenn Sie dies tun, machen Sie es zumindest anhand des Namens der Methode offensichtlich. (Clean Code) – Elliot

7

Sie müssen einen Versuch-Fang um jede Aussage setzen. Es gibt keine Fortsetzung (wie es in ON ERROR ... RESUME Blöcke in VB gibt). Statt:

String a = null; 
try { 
    a = getProperty("a"); 
} catch(Exception e) { 
    ... 
} 
String b = null; 
try { 
    b = getProperty("b"); 
} catch(Exception e) { 
    ... 
} 
String c = null; 
try { 
    c = getProperty("c"); 
} catch(Exception e) { 
    ... 
} 

könnten Sie schreiben:

public String getPropertyNoException(String name) { 
    try { 
    return getProperty(name); 
    } catch (Exception e) { 
    return null; 
    } 
} 

Ich persönlich denke, ein getProperty() ein schlechter Kandidat Ausnahmen nur für all diesen zusätzlichen Textvorschlag für das Werfen erforderlich

+1

Ah ... Ich dachte, ich könnte mit einem einfacheren Ansatz wegkommen .. Danke .. – Legend

+1

Ja ... dass getProperty kommt aus einer anderen Bibliothek und ich wollte diesen Teil nicht wirklich berühren. – Legend

5

Da Sie das gleiche verwenden Funktion jedes Mal, wenn Sie in der Lage sein könnten, dies in eine Schleife zu setzen:

String[] abc = new String[3]; 
String[] param = {"a", "b", "c"}; 
for (int i = 0; i < 3; i++) { 
    try { 
     abc[i] = getProperty(param[i]); 
    } catch(Exception e) { 

    } 
} 

aber dies ist eher erfunden und würde nur für eine große Anzahl von Eigenschaften nützlich sein. Ich vermute du wirst einfach 3 Versuch-Catch schreiben müssen.

3

Sie sollten darüber nachdenken, wie getProperty behandelt wird, wenn Sie planen, viele von ihnen zu verwenden, weil es gibt keine einfache Art, es zu tun.

Sie können finally Anweisung auswerten, aber Sie benötigen immer noch eine try-catch für jeden Anruf.