Java-beweringen
Java-beweringen
In deze tutorial zullen we leren over de Java assert statement (Java assertions) met behulp van voorbeelden.
Beweringen in Java helpen om bugs te detecteren door code te testen waarvan we aannemen dat deze waar is.
Een bewering wordt gedaan met behulp van de assert
zoekwoord.
De syntaxis is:
assert condition;
Hier, condition
is een booleaanse uitdrukking waarvan we aannemen dat deze waar is wanneer het programma wordt uitgevoerd.
Beweringen inschakelen
Standaard zijn beweringen uitgeschakeld en genegeerd tijdens runtime.
Om beweringen mogelijk te maken, gebruiken we:
java -ea:arguments
OF
java -enableassertions:arguments
Wanneer beweringen zijn ingeschakeld en de voorwaarde is true
, het programma wordt normaal uitgevoerd.
Maar als de voorwaarde resulteert in false
terwijl beweringen zijn ingeschakeld, gooit JVM een AssertionError
, en het programma stopt onmiddellijk.
Voorbeeld 1:Java-bevestiging
class Main {
public static void main(String args[]) {
String[] weekends = {"Friday", "Saturday", "Sunday"};
assert weekends.length == 2;
System.out.println("There are " + weekends.length + " weekends in a week");
}
}
Uitvoer
There are 3 weekends in a week
We krijgen de bovenstaande uitvoer omdat dit programma geen compilatiefouten heeft en standaard beweringen zijn uitgeschakeld.
Nadat we beweringen hebben ingeschakeld, krijgen we de volgende uitvoer:
Exception in thread "main" java.lang.AssertionError
Een andere vorm van beweringen
assert condition : expression;
In deze vorm van assertion statement wordt een expressie doorgegeven aan de constructor van de AssertionError
object. Deze uitdrukking heeft een waarde die wordt weergegeven als het detailbericht van de fout als de voorwaarde false
is .
Het gedetailleerde bericht wordt gebruikt om de informatie over de mislukte bewering vast te leggen en te verzenden om te helpen bij het opsporen van fouten.
Voorbeeld 2:Java-bevestiging met uitdrukkingsvoorbeeld
class Main {
public static void main(String args[]) {
String[] weekends = {"Friday", "Saturday", "Sunday"};
assert weekends.length==2 : "There are only 2 weekends in a week";
System.out.println("There are " + weekends.length + " weekends in a week");
}
}
Uitvoer
Exception in thread "main" java.lang.AssertionError: There are only 2 weekends in a week
Zoals we in het bovenstaande voorbeeld zien, wordt de expressie doorgegeven aan de constructor van de AssertionError
object. Als onze veronderstelling is false
en beweringen zijn ingeschakeld, wordt een uitzondering gegenereerd met een passend bericht.
Dit bericht helpt bij het diagnosticeren en oplossen van de fout waardoor de bewering mislukte.
Bewering inschakelen voor specifieke klassen en pakketten
Als we geen argumenten geven aan de opdrachtregelschakelaars voor assertion,
java -ea
Dit maakt beweringen in alle klassen mogelijk, behalve systeemklassen.
We kunnen ook beweringen voor specifieke klassen en pakketten inschakelen met behulp van argumenten. De argumenten die aan deze opdrachtregelopties kunnen worden gegeven, zijn:
Bevestiging in klassennamen inschakelen
Om bewering voor alle klassen van ons programma Main mogelijk te maken,
java -ea Main
Om slechts één klas in te schakelen,
java -ea:AnimalClass Main
Dit maakt bewering alleen in de AnimalClass
. mogelijk in de Main
programma.
Bevestiging in pakketnamen inschakelen
Beweringen inschakelen voor pakket com.animal
en alleen de bijbehorende subpakketten,
java -ea:com.animal... Main
Schakel bewering in naamloze pakketten in
Assertie inschakelen in naamloze pakketten (wanneer we geen pakketverklaring gebruiken) in de huidige werkdirectory.
java -ea:... Main
Bevestiging inschakelen in systeemklassen
Om bevestiging in systeemklassen mogelijk te maken, gebruiken we een andere opdrachtregeloptie:
java -esa:arguments
OF
java -enablesystemassertions:arguments
De argumenten die aan deze schakelaars kunnen worden gegeven, zijn hetzelfde.
Beweringen uitschakelen
Om beweringen uit te schakelen, gebruiken we:
java -da arguments
OF
java -disableassertions arguments
Om beweringen in systeemklassen uit te schakelen, gebruiken we:
java -dsa:arguments
OF
java -disablesystemassertions:arguments
De argumenten die kunnen worden doorgegeven bij het uitschakelen van beweringen zijn dezelfde als bij het inschakelen ervan.
Voordelen van assertiviteit
- Snel en efficiënt voor het detecteren en corrigeren van bugs.
- Beweringscontroles worden alleen uitgevoerd tijdens het ontwikkelen en testen. Ze worden tijdens runtime automatisch verwijderd in de productiecode, zodat het de uitvoering van het programma niet vertraagt.
- Het helpt om standaardcode te verwijderen en code leesbaarder te maken.
- Refactoren en optimaliseert code met meer vertrouwen dat het correct functioneert.
Wanneer gebruik je beweringen
1. Onbereikbare codes
Onbereikbare codes zijn codes die niet worden uitgevoerd wanneer we het programma proberen uit te voeren. Gebruik beweringen om ervoor te zorgen dat onbereikbare codes ook daadwerkelijk onbereikbaar zijn.
Laten we een voorbeeld nemen.
void unreachableCodeMethod() {
System.out.println("Reachable code");
return;
// Unreachable code
System.out.println("Unreachable code");
assert false;
}
Laten we nog een voorbeeld nemen van een switch-statement zonder een standaard case.
switch (dayOfWeek) {
case "Sunday":
System.out.println("It’s Sunday!");
break;
case "Monday":
System.out.println("It’s Monday!");
break;
case "Tuesday":
System.out.println("It’s Tuesday!");
break;
case "Wednesday":
System.out.println("It’s Wednesday!");
break;
case "Thursday":
System.out.println("It’s Thursday!");
break;
case "Friday":
System.out.println("It’s Friday!");
break;
case "Saturday":
System.out.println("It’s Saturday!");
break;
}
De bovenstaande schakelverklaring geeft aan dat de dagen van de week slechts één van de bovenstaande 7 waarden kunnen zijn. Als er geen standaardgeval is, betekent dit dat de programmeur gelooft dat een van deze gevallen altijd zal worden uitgevoerd.
Er kunnen echter enkele gevallen zijn die nog niet zijn overwogen, waarbij de veronderstelling feitelijk onjuist is.
Deze aanname moet worden gecontroleerd met behulp van een bewering om er zeker van te zijn dat de standaardschakelaar niet wordt bereikt.
default:
assert false: dayofWeek + " is invalid day";
Als dayOfWeek heeft een andere waarde dan de geldige dagen, een AssertionError
wordt gegooid.
2. Aannames documenteren
Om hun onderliggende aannames te documenteren, gebruiken veel programmeurs opmerkingen. Laten we een voorbeeld nemen.
if (i % 2 == 0) {
...
} else { // We know (i % 2 == 1)
...
}
Gebruik in plaats daarvan beweringen.
Opmerkingen kunnen verouderd raken en niet meer synchroon lopen naarmate het programma groeit. We zijn echter genoodzaakt om de assert
. bij te werken verklaringen; anders kunnen ze ook mislukken voor geldige voorwaarden.
if (i % 2 == 0) {
...
} else {
assert i % 2 == 1 : i;
...
}
Wanneer mag je beweringen niet gebruiken
1. Argumenten controleren in openbare methoden
Argumenten in openbare methoden kunnen door de gebruiker worden verstrekt.
Dus als een bewering wordt gebruikt om deze argumenten te controleren, kunnen de voorwaarden mislukken en resulteren in AssertionError
.
In plaats van beweringen te gebruiken, laat het resulteren in de juiste runtime-uitzonderingen en behandel deze uitzonderingen.
2. Uitdrukkingen evalueren die de werking van het programma beïnvloeden
Roep geen methoden aan of evalueer geen uitzonderingen die later van invloed kunnen zijn op de werking van het programma in assertievoorwaarden.
Laten we een voorbeeld nemen van een lijst weekdagen die de namen van alle dagen in een week bevat.
ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ));
ArrayList<String> weekends= new ArrayList<>(Arrays.asList("Sunday", "Saturday" ));
assert weekdays.removeAll(weekends);
Hier proberen we elementen Saturday
te verwijderen en Sunday
uit de ArrayList weekdagen .
Als de bewering is ingeschakeld, werkt het programma prima. Als beweringen echter zijn uitgeschakeld, worden de elementen uit de lijst niet verwijderd. Dit kan leiden tot een programmafout.
Wijs in plaats daarvan het resultaat toe aan een variabele en gebruik die variabele vervolgens voor bewering.
ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ));
ArrayList<String> weekends= new ArrayList<>(Arrays.asList("Sunday", "Saturday" ));
boolean weekendsRemoved = weekdays.removeAll(weekends);
assert weekendsRemoved;
Op deze manier kunnen we ervoor zorgen dat alle weekends worden verwijderd van de weekdagen ongeacht of de bewering is in- of uitgeschakeld. Als gevolg hiervan heeft het geen invloed op de werking van het programma in de toekomst.
Java