it-swarm.com.de

Was ist ein AssertionError? In welchem ​​Fall sollte ich es aus meinem eigenen Code werfen?

In Artikel 2 des Buchs "Effective Java, 2nd Edition" ist dieser Code-Code enthalten, in dem der Autor die leere Initialisierung eines Objekts verbieten möchte.

class Example {
    private Example() {
        throw new AssertionError();
    }
}

Die Art der geworfenen Ausnahme verwirrt mich hier.

Ich verstehe nicht, ob AssertionError nur aufgrund fehlender passender Fehler geworfen wird oder weil dies so sein sollte.

Soweit ich weiß, wird dieser Fehler vom Framework ausgelöst, wenn eine assert-Anweisung fehlschlägt. Im Javadoc wird auch nur geschrieben

[Ein AssertionError wird] ausgelöst, um anzuzeigen, dass eine Assertion fehlgeschlagen ist.

Ich sehe jedoch keine Behauptung (wahr-falsch-Aussage), die hier verletzt wird ... Natürlich wurde die Aussage "Sie dürfen keine Elemente dieser Klasse instanziieren" verletzt, aber wenn dies die Logik dahinter ist, dann wir sollten alle AssertionErrors überallhin werfen, und das ist offensichtlich nicht das, was passiert.

FWIW, ich hätte gerade einen geworfen

new IllegalStateException("Must not instantiate an element of this class")

Stimmt etwas nicht? In welchem ​​Fall sollte ich einen AssertionError in meinen eigenen Code werfen?

Tut mir leid, wenn es nur ein subtiler Zweifel ist, aber ich verwende dieses Muster sehr oft in meinem Code und möchte sicherstellen, dass ich das Richtige mache.

53
doplumi

Natürlich wurde die Anweisung "Du sollst keinen Gegenstand dieser Klasse instanziieren" verletzt, aber wenn dies die Logik dahinter ist, sollten wir alle überall AssertionErrors werfen, und das ist offensichtlich nicht das, was passiert.

Der Code besagt nicht, dass der Benutzer den Konstruktor zero-args nicht aufrufen sollte. Die Behauptung ist da, um zu sagen, dass, soweit der Programmierer weiß, er/sie es nmöglich gemacht hat, den Konstruktor zero-args aufzurufen (in diesem Fall indem er private und Aufruf nicht aus dem Code von Example). Wenn also ein Aufruf erfolgt, wurde diese Behauptung verletzt, und daher ist AssertionError angemessen.

38
T.J. Crowder

Die Bedeutung von AssertionError ist, dass etwas passiert ist, von dem der Entwickler glaubte, dass es nicht möglich ist.

Wenn also ein AssertionError ausgelöst wird, ist dies ein deutliches Zeichen für einen Programmierfehler.

29
Henry

Ein Assertionsfehler wird ausgegeben, wenn Sie sagen: "Sie haben einen Code geschrieben, der nicht um jeden Preis ausgeführt werden sollte, da er Ihrer Logik nach nicht auftreten sollte. ABER wenn dies passiert, werfen Sie AssertionError. In diesem Fall wird ein Assertionsfehler ausgegeben.

new IllegalStateException("Must not instantiate an element of this class")' // Is an Exception not error.

Hinweis: Assertionsfehler kommt unter Java.lang.Error und Fehler, die nicht abgefangen werden sollen.

14
Oliver

Ich bin wirklich spät dran, um hier zu feiern, aber die meisten Antworten scheinen über das Warum und Wann der Verwendung von Behauptungen im Allgemeinen zu handeln, anstatt AssertionError im Besonderen zu verwenden.

assert und throw new AssertionError() sind sich sehr ähnlich und dienen demselben konzeptionellen Zweck, es gibt jedoch Unterschiede.

  1. throw new AssertionError() löst die Ausnahme aus, unabhängig davon, ob Zusicherungen für jvm aktiviert sind (d. H. Über den Schalter -ea).
  2. Der Compiler weiß, dass throw new AssertionError() den Block verlässt. Wenn Sie ihn verwenden, können Sie bestimmte Compilerfehler vermeiden, die assert nicht verursachen.

Zum Beispiel:

    {
        boolean b = true;
        final int n;
        if ( b ) {
            n = 5;
        } else {
            throw new AssertionError();
        }
        System.out.println("n = " + n);
    }

    {
        boolean b = true;
        final int n;
        if ( b ) {
            n = 5;
        } else {
            assert false;
        }
        System.out.println("n = " + n);
    }

Der erste Block oben kompiliert ganz gut. Der zweite Block wird nicht kompiliert, da der Compiler nicht garantieren kann, dass n initialisiert wurde, wenn der Code versucht, ihn auszudrucken.

1
Matthew McPeak

AssertionError ist eine ungeprüfte Ausnahme, die vom Programmierer oder vom API-Entwickler explizit ausgelöst wird, um anzuzeigen, dass die assert-Anweisung fehlschlägt. 

assert(x>10);

Ausgabe:

AssertionError

Wenn x nicht größer als 10 ist, wird die Laufzeitausnahme AssertionError angezeigt.

0
Raman Gupta