Het assert mechanisme verscheen in Java 1.4 en is bedoeld om invarianten en toestanden binnen de code te controleren tijdens de ontwikkeling en debugging. Assert helpt bij het opsporen van vroege fouten tijdens het testen, maar moet met voorzichtigheid worden gebruikt en vervangt geen foutafhandeling in productie.
Achtergrond:
In sommige programmeertalen zijn assert constructs al lang beschikbaar, terwijl ze in Java relatief laat zijn toegevoegd. Het belangrijkste doel is het gemak van het diagnosticeren van logica tijdens ontwikkeling en testen.
Probleem:
Onjuist gebruik van assert kan ertoe leiden dat belangrijke controles verdwijnen (als assert is uitgeschakeld), of tot onverwachte fouten in productie als geprobeerd wordt assert te gebruiken als foutafhandeling voor verwachte fouten.
Oplossing:
Assert wordt alleen gebruikt voor het controleren van voorwaarden die nooit in strijd mogen worden met elkaar (bijvoorbeeld invarianten, precondities, postcondities), en niet voor het valideren van gebruikersinvoer. In productie is assert meestal standaard uitgeschakeld (JVM start met -ea/-enableassertions om assert in te schakelen).
Voorbeeld gebruik:
public void process(int value) { assert value > 0 : "Value must be positive"; // ... }
Belangrijke eigenschappen:
Wat gebeurt er als de assert-voorwaarde onwaar is en assert aanstaat?
Er wordt een java.lang.AssertionError opgegooid. Het programma kan abrupt stoppen als de fout niet wordt opgevangen.
Worden asserts altijd uitgevoerd?
Nee. Ze werken alleen wanneer de JVM wordt gestart met de -ea vlag. Standaard (in productie) worden ze niet uitgevoerd.
Mag ik assert gebruiken om gebruikersinvoer te controleren?
Absoluut niet! Voor het controleren van invoergegevens worden exceptieafhandeling en validatie gebruikt, omdat assert kan worden uitgeschakeld, waardoor controles niet worden uitgevoerd.
Een ontwikkelaar controleert de geldigheid van een gebruikersparameter met assert, maar productie draait zonder -ea. De controle faalt en de fout komt pas later in de logica aan het licht, wat complexe bugs veroorzaakt.
Voordelen:
Nadelen:
Een ontwikkelaar gebruikt assert alleen voor interne controle van invarianten tijdens de ontwikkeling. Voor gebruikersfouten — uitzonderingen en standaardvalidatie.
Voordelen:
Nadelen: