Was ist der Verwendungszweck von IllegalStateException?
Dieser kam in eine Diskussion mit einer Kollegin heute.
Den Javadocs für Java IllegalStateException
behaupten, dass es:
Signale, dass eine Methode aufgerufen wurde, die auf eine rechtswidrige oder unangemessene Zeit. In anderen Worten, die Java environment oder Java-Anwendung ist nicht in einem geeigneten Zustand für den angeforderten Vorgang.
Und Effektive Java-sagt (Item 60, Seite 248):
Anderen Häufig wiederverwendet Ausnahme IllegalStateException. Dies ist in der Regel die Ausnahme zu werfen, wenn der Aufruf ist illegal, weil der Staat das empfangende Objekt. Zum Beispiel, das wäre die Ausnahme, wenn der Aufrufer versucht, auf ein Objekt, bevor es wurde richtig initialisiert.
Scheint es da ein wenig Diskrepanz hier. Der zweite Satz des javadocs macht es klingen wie die Ausnahme könnte beschreiben ein sehr breites Zustand, der von der Java-Ausführung Zustand, aber die Beschreibung im Wirksamen Java macht es klingen wie es ist verwendet werden, für die Bedingungen im Zusammenhang speziell auf den Zustand der Zustand des Objekts, dessen Methode aufgerufen wurde.
Den Gepflogenheiten, die ich gesehen habe in der JDK (z.B. Sammlungen, Matcher
) und Guave definitiv scheinen, fallen in die Kategorie, die Effektive Java-Gespräche über ("Das Objekt ist in einem Zustand, wo diese Methode kann nicht aufgerufen werden"). Dies scheint auch im Einklang mit IllegalStateException
's Geschwister IllegalArgumentException
.
Gibt es irgendwelche legitime IllegalStateException
Nutzungen im JDK, die beziehen sich auf die "Java environment" oder "Java-Anwendung"? Oder irgendwelche best-practices-guides plädieren für den breiteren Ausführung-Zustand? Wenn nicht, warum zum Teufel sind die javadocs formuliert? 😉
InformationsquelleAutor der Frage Andrew McNamee | 2012-10-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine insbesondere rechtmäßige Nutzung dieser Ausnahme im JDK (siehe:
URLConnection.setIfModifiedSince(lang)
unter den 300+ anderen Nutzungen:Ich denke, das Beispiel ist ziemlich klar. Wenn sich das Objekt in bestimmten Zustand ("Bereits angeschlossen"), einige Vorgänge sollten nicht genannt werden. In diesem Fall, wenn Verbindung aufgebaut wurde, einige Eigenschaften können nicht festgelegt werden.
Diese Ausnahme ist besonders nützlich, wenn Ihre Klasse hat einige Staatliche (state machine?) im Laufe der Zeit Veränderungen, so dass einige Methoden, irrelevant oder unmöglich. Denken Sie über eine
Car
Klasse, hatstart()
stop()
undfuel()
Methoden. Beim Aufrufstart()
zweimal, eine nach der anderen, vermutlich nichts falsch, aber Betankung ein Auto gestartet ist sicherlich eine schlechte Idee. Nämlich - Auto ist in einem falschen Zustand.Wohl gute API sollte uns nicht erlauben, zu rufen Methoden in der falschen Zustand, so dass Sie solche Probleme entdeckt werden, die zur Kompilierzeit, nicht zur Laufzeit. In diesem speziellen Beispiel den Anschluss an eine URL zurückgeben sollte, ein anderes Objekt mit einer Teilmenge von Methoden, die alle gültig sind, die nach Anschluss.
InformationsquelleAutor der Antwort Tomasz Nurkiewicz
Hier ist ein Beispiel in der JDK. Es ist ein Paket private Klasse namens java.lang.Shutdown. Wenn das system heruntergefahren wird, und versuchen Sie, fügen Sie einen neuen Haken, wirft es die IllegalStateException. Man könnte argumentieren, dass diese erfüllt die Kriterien der "javadoc" Anleitung - da es die Java-Umgebung, im falschen Zustand.
Aber es zeigt auch, dass es wirklich keinen Unterschied zwischen dem "javadoc" - Führung und der "Effective Java" in Führung. Aufgrund der Art und Weise Herunterfahren implementiert ist, wird die shutdown-ness der JVM gespeichert ist, in ein Feld namens Status. Daher erfüllt auch die "Effective Java" Anleitung für die Verwendung IllegalStateException, da die "state" - Feld ist Teil des Staates, der das empfangende Objekt. Da das empfangende Objekt (Shutdown) im falschen Zustand, es wirft die IllegalStateException.
Meiner Meinung nach die beiden Beschreibungen, Wann IllegalStateException konsistent sind. Die Effektive Java-Beschreibung ist ein wenig mehr praktische, das ist alles. Für die meisten von uns der wichtigste Teil der gesamten Java-Umgebung ist die Klasse, die wir schreiben, gerade jetzt, so das ist, was der Autor konzentriert sich auf.
InformationsquelleAutor der Antwort Guido Simone
Ich denke, wenn Sie sehen, die Nutzung von
IllegalStateException
ich würde sagen, die zweite, wenn mehr angemessen. Diese Ausnahme verwendet wird in viele PaketeAngeben, ein Beispiel ArrayBlockingQueue.hinzufügen löst diese Ausnahme aus, wenn die Warteschlange bereits voll ist. Jetzt voll ist-Zustand des Objekts, und es wird aufgerufen, die auf unangemessenen oder Illegalen Zeit
Ich denke, beide Mittel gleich, aber ein Unterschied der Formulierung.
InformationsquelleAutor der Antwort Amit Deshpande
Gibt es keine 'Diskrepanz' hier. Es gibt nichts in Blochs Formulierung, die ausschließt, was es sagt, in der JLS. Bloch ist einfach zu sagen, dass, wenn Sie haben, Ein Umstand, werfen diese exception. Er ist nicht sagen, dass diese Ausnahme ist/sein sollte geworfen nur in diesem Zustand. Die JLS sagt, diese Ausnahme wird geworfen, wenn A, B, oder C.
InformationsquelleAutor der Antwort EJP
Lief ich in diese mit:
Denke ich, dass es unpraktisch für mich zu werfen
IllegalStateException
hier im OrtAssertionException
obwohl das fällt in die "Java Umgebung" - Kategorie.InformationsquelleAutor der Antwort antak
Gegeben, eine Bibliothek, sollte es wirft einen
IllegalStateException
oderIllegalArgumentException
wenn er erkennt Fehler, die durch Benutzer-code, in der Erwägung, dass die Bibliothek werfen sollte einAssertionError
wenn es feststellt, dass ein Fehler durch die Bibliothek eine eigene Implementierung.Beispielsweise in der Bibliothek-tests, können Sie erwarten, dass die Bibliothek wirft ein
IllegalStateException
wenn die Reihenfolge der Methodenaufrufe sind falsch. Aber Sie werden nie erwarten, dass die Bibliothek wirft einAssertionError
.InformationsquelleAutor der Antwort Yang Bo