Wat is een assertError? In welk geval moet ik het uit mijn eigen code gooien?

In item 2 van het boek “Effectieve Java, 2e editie”, is er deze fragment van code, waarin de auteur de lege initialisatie van een object wil verbieden.

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

Het type uitzondering gegooid, is wat me hier verwart.

Ik begrijp niet of de AssertionErrorwordt gegooid, alleen vanwege een afwezigheid van meer geschikt fouten of omdat het op deze manier moet zijn.

Zoals ik begrijp, wordt deze fout door het raamwerk gegooid wanneer een assertverklaring mislukt. Ook in de Javadoc is het net geschreven

[Een AssertionError is] gegooid om aan te geven dat een bewering is mislukt.

Maar ik zie geen bewering (ware-valse verklaring) hier geschonden.
Natuurlijk is de “U mag niet instantiëren van een item van deze klasse” verklaring is geschonden, maar als dit de logica achter dat is, dan moeten we allemaal AssertionErrorS overal gooien, en dat is natuurlijk niet wat gebeurt.

FWIW, ik zou net een

hebben gegooid

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

Is er iets mis mee? In welk geval moet ik een AssertionErrorin mijn eigen code gooien?

Sorry als het gewoon een subtiele twijfel is, maar ik gebruik dit patroon veel in mijn code en ik wil ervoor zorgen dat ik het goede doe.


Antwoord 1, Autoriteit 100%

Natuurlijk is de instructie “You will not instantiate an item of this class” geschonden, maar als dit de logica hierachter is, dan zouden we allemaal AssertionErrorsoveral moeten gooien, en dat is duidelijk niet wat er gebeurt.

De code zegt niet dat de gebruiker nietde zero-args constructor moet aanroepen. De bewering is er om te zeggen dat voor zover de programmeur weet, hij/zij het onmogelijkheeft gemaakt om de zero-args constructor aan te roepen (in dit geval door het privateen het niet aanroepen vanuit de code van Example). En dus als er een aanroep plaatsvindt, is die bewering geschonden, en dus is AssertionErrorgepast.


Antwoord 2, autoriteit 75%

De betekenis van een AssertionErroris dat er iets is gebeurd waarvan de ontwikkelaar dacht dat het onmogelijk was.

Dus als er ooit een AssertionErrorwordt gegenereerd, is dit een duidelijk teken van een programmeerfout.


Antwoord 3, autoriteit 36%

Er wordt een assertion Error gegenereerd als je zegt: “Je hebt een code geschreven die niet ten koste van alles zou moeten worden uitgevoerd omdat het volgens jouw logica niet zou moeten gebeuren. MAAR als het gebeurt, gooi dan AssertionError. En je snapt het niet.” In zo’n geval gooi je een Assertion-fout.

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

Opmerking: beweringsfout valt onder java.lang.Error en fouten die niet bedoeld zijn om te worden opgevangen.


Antwoord 4, autoriteit 15%

Ik ben erg laat om hier te feesten, maar de meeste antwoorden lijken te gaan over het waarom en wanneer van het gebruik van beweringen in het algemeen, in plaats van AssertionErrorin het bijzonder.

asserten throw new AssertionError()lijken erg op elkaar en hebben hetzelfde conceptuele doel, maar er zijn verschillen.

  1. throw new AssertionError()zal de uitzondering genereren ongeacht of assertions zijn ingeschakeld voor de jvm (d.w.z. via de -easwitch).
  2. De compiler weet dat throw new AssertionError()het blok zal verlaten, dus als je het gebruikt, kun je bepaalde compilerfouten vermijden die assertniet zullen doen.

Bijvoorbeeld:

   {
        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);
    }

Het eerste blok hierboven compileert prima. Het tweede blok compileert niet, omdat de compiler niet kan garanderen dat nis geïnitialiseerd op het moment dat de code het probeert af te drukken.


Antwoord 5

AssertionErroris een niet-gecontroleerde uitzondering die expliciet door de programmeur of door API-ontwikkelaar wordt verhoogd om aan te geven dat de assert-instructie mislukt.

assert(x>10);

Uitvoer:

AssertionError

Als x niet groter is dan 10, krijgt u een runtime-uitzondering met de melding AssertionError.

Other episodes