Java: warum kann ich nicht eine exception werfen im Komparator?
Die direkte Antwort ist, weil Comparator.compare
s-Schnittstelle ist als solche angegeben, dass es keine Ausnahmen. Aber warum ist das so?
Oder um es mal anders: Meine Comparator
müssen, hängt von einer Funktion, die eine exception werfen. In der Theorie sollte das nicht passieren. Aber wenn es passiert, möchte ich, dass es bricht aus dem gesamten Funktion, wo ich bin mit diesem Comparator
(in Collections.sort
). I. e. Ich will einfach, es verhält sich so, als wenn eine nicht behandelte Ausnahme ist aufgetreten.
Scheint es, dass dies nicht möglich ist, in eine offensichtliche Natürliche Art und Weise (denn wenn die Schnittstelle sagt, dass es nicht eine exception werfen, kann es auch nicht).
Wie würde ich dieses Problem lösen? Mit einem hässlichen try/catch und drucken Sie die Ausnahme und hoffe, dass ich es erkennen? Das scheint eine ziemlich hässliche Art und Weise.
- Haben Sie als das werfen einer RuntimeException statt? (eventuell die Verpackung um die checked exception)
Du musst angemeldet sein, um einen Kommentar abzugeben.
In diesem Fall würde ich rethrow eine
AssertionError
da Sie davon ausgehen, dass die Ausnahme nicht ausgelöst werden. Vergessen Sie nicht, verwenden Sie dieinitCause()
Methode um die Informationen zu verbreiten (AssertionError
nicht über einen Konstruktor verfügen, der Annahme einerThrowable
)AssertionError
hat einen Konstruktor akzeptiert eineObject
, die verwendet werden, als die Ursache, wenn esThrowable
. (Zufällige Randnotiz: ich glaube, Sie sind die Verbesserung dieser in JDK7.)Können Sie immer werfen Sie eine RuntimeException, oder eine daraus abgeleitete, selbst von einer Methode, die nicht explizit deklarieren sich zu werfen Ausnahmen.
Diesem Vertrag ist der Komparator.compare-Methode. Wenn Sie es verwenden möchten, sollten Sie Folgen Sie einfach die Regel nicht zu werfen checked exceptions von ihm 🙂
In der Zwischenzeit können Sie werfen unchecked exception (RuntimeException oder seiner Unterklasse) und dies wird nicht unterbrechen Vertrag.
Es ist, weil Sie nicht annotiert Ihre Methode mit Lombok @SneakyThrows annotation.
Check it out auf http://projectlombok.org/features/SneakyThrows.html
Die demo und Folien auf der Lombok-homepage sind auch einen Blick Wert http://projectlombok.org/
Fragen Sie verschiedene Fragen in den Frage Titel und in der Frage Körper.
Sie waren nicht klar, warum die Ausnahme-fähig-Funktion verwendet, durch die
compare()
Methode eine Ausnahme werfen. Es ist entweder, weil es bestimmte unvergleichliche Objekte in der Sammlung (wie einNaN
numberic Wert) oder aber, es ist, weil es bestimmte Paare von Objekten, die nicht miteinander verglichen.Ich würde vermuten
Comparator.compare()
ist nicht darauf ausgelegt zu werfen, eine geprüfte Ausnahme, weil:es wird davon ausgegangen, dass alle Elemente, die Sie wünschen würde, um zu vergleichen/Sortieren würde immer vergleichbar.
wenn ein
Comparator.compare()
werfen könnte irgendeine Art von erwarteten (d.h. überprüft) Ausnahme, dann kann ich mir vorstellen, ein paar unerwünschte Szenarien:ein. eine Art könnte Abbrechen, weil es ist eine Art unvergleichliche Objekt in gibt, die wahrscheinlich Antworten auf entfernen Sie die unvergleichliche Objekt(en) und versuchen Sie die Sortierung wieder
b. mehrere Arten auf die verschiedenen Ordnungen von der gleichen Sammlung der Objekte könnten manchmal Abbrechen mit einer Ausnahme, und manchmal erfolgreich, je nachdem, ob oder nicht ein paar unvergleichliche Objekte geschehen zu kommen, zum Vergleich beim Sortieren
Dies ist natürlich nur meine Vermutung.
Ich werde davon ausgehen, dass der Grund der Ausnahme-Funktion, die Ihre
Comparator.compare()
verwendet, löst eine Ausnahme ist, weil es eine unvergleichliche Objekt in der Sammlung (wie einNaN
numberic-Wert). Zu den Optionen gehören:Art eine Kopie der Liste mit den unvergleichliche Objekt(E) gelöscht.
Werfen eine unchecked (runtime) exception zum Abbruch der Sortierung. Nicht sicher, was Sie tun würden dann andere als #1 oben.
Folgen Sie den
NaN
Ansatz und machen so diese Objekte kommen am Anfang oder Ende.NaN
Werte sind normalerweise unvergleichliche auf andere Werte, aber während eine Art, der Komparator definiert Ihre eigene gesamte Bestellung, so dassNaN
Werte Ende bis an das Ende der sortierten Sammlung.http://download.oracle.com/javase/1.4.2/docs/api/java/util/Arrays.html#sort(double%5B%5D)
Hierzu code Ihrer
Comparator.compare()
so, dass jeder unvergleichbaren Objekt vergleicht immer größer als alle vergleichbaren Objekt und vergleicht immer gleich alle anderen unvergleichbaren Objekt.Gibt es 2 Möglichkeiten dies zu lösen:
java.lang.RuntimeException()
oderDen Vertrag für den Komparator compare Methode keine exceptions werfen.
equals()
Methode), so dass Chancen der Ausnahmen, die geworfen werden, sind minimal. Protokoll der Ausnahme & halten Sie die Arbeit hilft in einer Weise, die später erkennen Sie eine Ausnahme geworfen wurde. Die coder können, schicken Sie einfach eine -1, wenn eine Ausnahme geworfen wurde. Die Protokollierung gibt viel info in die Datei, etc.Können Sie rethrow eine checked exception und vermeiden Sie die Zusammenstellung ein Fehler durch eine Reihe von tricks. Die einfachste ist;
Jedoch, da der compiler hat keine Ahnung, dass Sie dies getan haben. Sie verwirren kann und Sie sich, wenn Sie nicht vorsichtig sind. Eines der Ziele der Verschlüsse zu behandeln checked exceptions in Dinge wie Komparatoren korrekt (während andere lieber gingen Sie Weg)
Dieser Artikel beschreibt, warum das werfen einer RuntimeException aus dem inneren des Comparator-interface ist eine schlechte Idee, und es zeigt Beispiel-Quellcode für zwei good-practice-Möglichkeiten zum Umgang mit checked exceptions innerhalb von Schnittstellen, die diese nicht unterstützen: 1) aufteilen des Problems in zwei Teile zu teilen, oder 2) verwenden Sie Ihre eigenen comparator unterstützt checked exceptions.
https://www.ibm.com/developerworks/library/j-ce/index.html