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 AssertionError
wordt 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 assert
verklaring 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 AssertionError
S 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 AssertionError
in 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
AssertionErrors
overal 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 private
en het niet aanroepen vanuit de code van Example
). En dus als er een aanroep plaatsvindt, is die bewering geschonden, en dus is AssertionError
gepast.
Antwoord 2, autoriteit 75%
De betekenis van een AssertionError
is dat er iets is gebeurd waarvan de ontwikkelaar dacht dat het onmogelijk was.
Dus als er ooit een AssertionError
wordt 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 AssertionError
in het bijzonder.
assert
en throw new AssertionError()
lijken erg op elkaar en hebben hetzelfde conceptuele doel, maar er zijn verschillen.
throw new AssertionError()
zal de uitzondering genereren ongeacht of assertions zijn ingeschakeld voor de jvm (d.w.z. via de-ea
switch).- De compiler weet dat
throw new AssertionError()
het blok zal verlaten, dus als je het gebruikt, kun je bepaalde compilerfouten vermijden dieassert
niet 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 n
is 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.