2016-11-13 1 views
0

Ich habe diesen Java-Code, den ich ausführen möchte. Es sollte eine Ausnahme auslösen, wenn es mehr als 4 Strings vollständig hinzugefügt wurde, aber es sollte nicht benötigt werden, um ein try/catch zu verwenden, wenn die addString-Methode das erste Mal aufgerufen wird.Throw Ausnahmen ohne zu versuchen in Java zu verwenden

Foo myFoo = new Foo(); 
myFoo.addString("String A"); 
myFoo.addString("String B"); 
myFoo.addString("String C"); 
myFoo.addString("String D"); 


boolean exceptionThrown = false; 

try { 
    myFoo.addString("String E"); 
} catch (NoRoomForMoreStringsException e) { 
    exceptionThrown = true; 
} 

assertTrue(exceptionThrown); 

Wenn ich so etwas wie dies in der addString Funktion hinzufügen, wird es mir verlangen, immer eine trow/catch-Anweisung zu verwenden.

public void addString(String str) throws NoRoomForMoreStringsException { 
    ... 
    if(strings.size() >= 4) { 
     throw new NoRoomForMoreStringsException(); 
    } 

Wie kann ich eine Ausnahme in der addString-Methode auslösen, ohne immer die try/catch-Anweisung verwenden zu müssen?

+0

Warum ruft nicht nur setzen alle Verfahren in einem einzigen Versuch Haken? – cYrixmorten

+0

Oder wenn Sie die Ausnahmebehandlung nicht mögen, geben Sie einen booleschen Wert zurück, der angibt, ob die Aktion erfolgreich war oder nicht. – cYrixmorten

+0

Wenn Sie es nicht zu einer 'RuntimeException' machen wollen, macht Ihre Frage keinen Sinn. Wenn Sie wissen, welcher Aufruf die Ausnahme auslöst, brauchen Sie die Ausnahme nicht, und wenn Sie nicht wissen, wissen Sie nicht, wo Sie den try-catch weglassen können. – EJP

Antwort

1

Wie kann ich eine Ausnahme in der addString-Methode auslösen, ohne zu benötigen, um immer die try/catch-Anweisung zu verwenden?

Sie müssen NoRoomForMoreStringsException als RuntimeException erklären, wie unten dargestellt:

public NoRoomForMoreStringsException extends RuntimeException { 

    //methods for custom exception 
} 

In Java Exception Objekte gibt zwei Arten:

(1) Geprüft Ausnahmen: Diese Ausnahmen Sie zwingen Versuchen/fangen oder deklarieren Sie sie in Methodensignatur (wie Ihre aktuelle NoRoomForMoreStringsException). Die beste Vorgehensweise besteht darin, diese Checked Exceptions sehr sorgfältig zu verwenden, d. H. Nur dann, wenn Sie beim Abfangen der Ausnahme eine Wiederherstellungsaktion ausführen müssen.

(2) Ungeprüfte/Runtime-Ausnahmen: Diese Ausnahmen erzwingen nicht, dass Sie die Ausnahme abfangen oder deklarieren.

In den meisten Fällen können Sie Runtime Exceptions (Typ 2 oben) bevorzugen, weil wir im Allgemeinen sehr wenig tun (wie Logging), wenn wir eine Ausnahme bekommen.

Da geprüfte Ausnahmen sehr laut sind (dh sie die Anrufer entweder zwingen, zu fangen oder zu erklären, in Methodensignaturen), populäre Frameworks (wie Spring) versuchen, sie also zu vermeiden, wirft Spring Runtime Ausnahmen oder sogar besser Wraps/konvertiert die Checked Ausnahmen (falls vorhanden von JDK) in Laufzeit-Ausnahmen und dann Würfe.

kurz Also, wenn Sie einen Recovery-Mechanismus erhalten haben, werden Sie für aufgegebenes Exception (Typ1 oben) gehen, andernfalls Sie für Runtime (oben Typ2) gehen müssen

Sie here beziehen

+2

Ich stimme nicht zu, dass ungeprüfte Ausnahmen vorzuziehen sind. Es hängt nur vom Kontext ab. Ein "threshesp" wird Teil der Methodensignatur und somit auch, wie Sie es verwenden können. Als Aufrufer dieser Methode sagt er mir, welche Ausnahmen ich erwarten kann. Wenn Sie z. B. beschließen, 'IllegalArgumentException' zu werfen, wobei' FileNotFoundException' geeigneter wäre und Sie dies nicht dokumentieren, stürzen Sie wahrscheinlich mein Programm ab und ich werde wahrscheinlich Ihren Code nicht mehr verwenden. – Robert

+0

Mein Punkt ist, wenn Sie einen Wiederherstellungsplan der Handlung haben, natürlich ja, wir müssen für geprüfte Ausnahme gehen, das ist, was es oben hervorgehoben wird. – developer

2

Ihr NoRoomForMoreStringsException kann ein unchecked exception sein. Ich sage nicht, dass dies eine gute Idee ist, aber es wird erreichen, was Sie fragen.

-1

Der Compiler wird sich beschweren, wenn Sie es nicht abfangen, aber es wird immer noch kompilieren und läuft gut.

public static void main(String args[]){ 
    System.out.println("Starting!"); 
    Foo myFoo = new Foo(); 
    myFoo.addString("String A"); 
    myFoo.addString("String B"); 
    myFoo.addString("String C"); 
    myFoo.addString("String D"); 
    myFoo.addString("String E"); 
} 

Und die Ausgabe:

Starting! 
Adding: String A 
Adding: String B 
Adding: String C 
Adding: String D 
Adding: String E 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4 
    at Foo.addString(Foo.java:6) 
    at StackOverFlow.main(StackOverFlow.java:9) 
+2

Das ist eine andere Ausnahme. –

+0

(@Dave) und insbesondere AIOOBE ist eine 'RuntimeException', daher nicht aktiviert, wie bereits in den anderen Antworten beschrieben. –

+0

Hatte google, ArrayIndexOutOfBoundsException. –

Verwandte Themen