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

Lesezeit: 5 Minuten

Benutzer-Avatar
doplumi

In Punkt 2 des Buches “Effective Java, 2nd Edition” gibt es diesen Codeschnipsel, in dem der Autor die leere Initialisierung eines Objekts verbieten will.

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

Die Art der ausgelösten Ausnahme verwirrt mich hier.

Ich verstehe nicht, ob die AssertionError geworfen wird, nur weil passendere Fehler fehlen oder weil es so sein sollte.

Soweit ich weiß, wird dieser Fehler vom Framework ausgelöst, wenn an assert Aussage schlägt fehl. Auch im Javadoc ist es nur geschrieben

[An AssertionError is] Wird ausgelöst, um anzuzeigen, dass eine Assertion fehlgeschlagen ist.

Aber ich sehe keine Behauptung (Wahr-Falsch-Aussage), die hier verletzt wird. Natürlich wurde gegen die Anweisung “Sie dürfen ein Element dieser Klasse nicht instanziieren” verstoßen, aber wenn dies die Logik dahinter ist, sollten wir alle werfen AssertionErrorist überall, und das ist offensichtlich nicht das, was passiert.

FWIW, ich hätte einfach einen geworfen

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

Ist daran etwas falsch? In diesem Fall sollte ich eine werfen AssertionError in meinem eigenen Code?

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

  • “Behauptungen” bedeutet nicht nur “assert Aussagen“.

    – Benutzer253751

    21. Juli 2014 um 10:45 Uhr

  • Guave hat eine nützliche Referenz Vergleich mehrerer verschiedener Anwendungsfälle für Laufzeitausnahmen und AssertionError. Ich würde jeden ermutigen, der von diesem Muster überrascht ist, diese Seite zu lesen.

    – dimo414

    25. Dezember 2016 um 22:37 Uhr

Benutzer-Avatar
TJ Crowder

Natürlich wurde gegen die Anweisung “Sie dürfen ein Element dieser Klasse nicht instanziieren” verstoßen, aber wenn dies die Logik dahinter ist, sollten wir alle werfen AssertionErrors überall, und das ist offensichtlich nicht das, was passiert.

Der Code sagt den Benutzer nicht sollte nicht Rufen Sie den Zero-Args-Konstruktor auf. Die Behauptung ist da, um zu sagen, dass, soweit der Programmierer weiß, er/sie es gemacht hat unmöglich um den Zero-Args-Konstruktor aufzurufen (in diesem Fall, indem Sie ihn erstellen private und es nicht von innen heraus anzurufen ExampleCode von ). Wenn also ein Aufruf auftritt, wurde diese Behauptung verletzt und so AssertionError Ist angemessen.

  • Das macht Sinn. Das Auslösen dieser Ausnahme wäre also wie das Erstellen einer Behauptung und das Angeben des Werts false alles auf einmal, stimmst du dem zu?

    – doplumi

    21. Juli 2014 um 11:03 Uhr

  • @domenicop: Du hast es.!!

    – Oliver

    21. Juli 2014 um 11:04 Uhr

  • Beachten Sie, dass Sie auch verwenden könnten assert false. Mehr dazu hier

    – Maarten Bodewes

    1. August 2014 um 19:26 Uhr

  • @MaartenBodewes: Seien Sie vorsichtig, verwenden Sie assert false unterscheidet sich von throw new AssertionError();. Ersteres wird nur dann einen Fehler werfen, wenn das Java-Programm mit aktivierten Assertionen gestartet wird, während letzteres die Assertion immer wirft.

    – Matthias Bader

    25. Dezember 2016 um 21:41 Uhr

Benutzer-Avatar
Henry

Die Bedeutung eines AssertionError ist etwas passiert, was der Entwickler für unmöglich hielt.

Also wenn ein AssertionError jemals geworfen wird, ist dies ein klares Zeichen für einen Programmierfehler.

Ein Behauptungsfehler wird ausgelöst, wenn Sie sagen: “Sie haben einen Code geschrieben, der um keinen Preis ausgeführt werden sollte, weil es Ihrer Logik nach nicht passieren sollte. ABER wenn es passiert, dann lösen Sie AssertionError aus. Und Sie fangen es nicht ab.” In einem solchen Fall werfen Sie einen Assertion-Fehler.

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

Hinweis: Assertion Error kommt unter java.lang.Error And Errors, die nicht abgefangen werden sollen.

  • danke, ich habe hier eigentlich eine RuntimeException mit einem Fehler verwechselt, obwohl ich mich frage, ob der Unterschied nur in “sie sollen nicht abgefangen werden” oder “der Compiler wird sich weigern, Ihren Code zu kompilieren, wenn Sie sie abfangen” liegt.

    – doplumi

    21. Juli 2014 um 10:58 Uhr


  • Nein, du kannst Sachen machen wie catch(Throwable t){} Aber das ist sehr schlechter Code. Error und Throwable sollten nicht gefangen werden. Nehmen wir an, Sie bekommen a OutOfMemoryError und Sie stellen sich vor, Sie hätten keinen RAM mehr und Ihre App läuft noch. Das wird nicht gut sein. Sie werden Ihren PC ausblasen (nur ein Scherz).

    – Oliver

    21. Juli 2014 um 11:02 Uhr

Ich bin wirklich spät dran, hier zu feiern, aber die meisten Antworten scheinen sich auf das Warum und Wann der Verwendung von Behauptungen im Allgemeinen zu beziehen, anstatt sie zu verwenden AssertionError im Speziellen.

assert und throw new AssertionError() sind sehr ähnlich und dienen dem gleichen konzeptionellen Zweck, aber es gibt Unterschiede.

  1. throw new AssertionError() löst die Ausnahme aus, unabhängig davon, ob Zusicherungen für die jvm aktiviert sind (d. h. durch die -ea Schalter).
  2. Das weiß der Compiler throw new AssertionError() wird den Block verlassen, sodass Sie mit seiner Verwendung bestimmte Compilerfehler vermeiden können assert wird nicht.

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 lässt sich gut kompilieren. Der zweite Block wird nicht kompiliert, da der Compiler dies nicht garantieren kann n wurde initialisiert, wenn der Code versucht, es auszudrucken.

Benutzer-Avatar
Pankaj Kumar Yadav

assert len(tf.config.list_physical_devices('GPU')) > 0

Dies funktioniert nicht, wenn Sie die Zusammenarbeit verwenden

Verwenden Sie Jupyter Notebook, um die physische Geräte-GPU zu verwenden

Benutzer-Avatar
Raman Gupta

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

assert(x>10);

Ausgabe:

AssertionError

Wenn x nicht größer als 10 ist, erhalten Sie eine Laufzeitausnahme mit der Meldung AssertionError.

1228790cookie-checkWas ist ein AssertionError? In welchem ​​​​Fall sollte ich es aus meinem eigenen Code werfen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy