Blick durch Joshua Blochs 'Effective Java - Second Edition', stieß ich auf den folgenden Code auf Seite 152:Wird AssertionError aktiv in Java empfohlen?
double apply(double x, double y) {
switch(this) {
case PLUS: return x + y;
case MINUS: return x - y;
case TIMES: return x * y;
case DIVIDE: return x/y;
}
throw new AssertionError("Unknown op: " + this);
}
Jetzt verwirrt mich, was ist, dass die AssertionError
aktiv geworfen wird. Wird das als gute Praxis angesehen? Zu meinem Verständnis werden Assertions verwendet, um den Code nicht zu interferieren, so dass das Verhalten sich nicht ändert, wenn die Java-Programmierung ohne aktivierte Assertionen gestartet wird und die assert-Anweisungen daher nicht ausgeführt werden. Ich wäre ziemlich verwirrt, wenn ich ein AssertionException
bekommen würde, wenn ich ein Programm ausführen würde, ohne sogar Assertions aktiviert zu haben.
Obwohl ich verstehe, dass der Beispielfall ziemlich oft passieren kann, dass Sie ein paar verschiedene Optionen analysieren und wenn es keine von ihnen ist, sollten Sie eine Ausnahme auslösen.
Also ist es eine gute Übung, hier eine zu werfen, oder wäre es besser, eine andere zu werfen? Wenn ja, welche würde am besten passen? Vielleicht IllegalArgumentException
?
Bearbeiten zur Klarstellung: Meine Frage ist, nicht, ob wir ein Error
hier werfen sollte, aber wenn wir einen Exception
oder eine Error
werfen wollen, die man sollte es sein? Und ist es gute Praxis, AssertionError
s aktiv zu werfen? Die Dokumentation sagt geworfen, um anzuzeigen, dass eine Behauptung gescheitert ist, so habe ich das Gefühl, dass wir es nicht aktiv werfen sollten. Ist das korrekt?
Zweite Edit: Klar Frage: Ist es sinnvoll, sich aktiv ein AssertionError
zu werfen, oder dass vermieden werden sollte, auch wenn es möglich ist? (Meine Schätzung beim Lesen der Dokumente ist das letztere)
ganz Meinung basierte Es ist. Für meinen Teil werfe ich 'AssertionError'. Ich denke, der Hauptgrund dafür, Behauptungen in der Produktion nicht zu überprüfen, sind die Kosten für die Überprüfung der Behauptung, und im Beispiel in der Frage glaube ich nicht, dass es eine gibt. Ich bin auf Blochs Seite. –
Es ist definitiv ein Fehler, keine Ausnahme. Es gibt kein vernünftiges Szenario, in dem versucht werden sollte, den Fehler zu erkennen und die Ausführung fortzusetzen. –
So, um die Titelfrage zu beantworten, von dem, was ich von der Diskussion hier verstehe: Ja, es ist in Ordnung, einen "AssertionError" in Ihrem Programm zu werfen. Und wenn Sie dies tun, müssen Assertions nicht eingeschaltet werden. –