Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> Java

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

  1. Snel en efficiënt voor het detecteren en corrigeren van bugs.
  2. 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.
  3. Het helpt om standaardcode te verwijderen en code leesbaarder te maken.
  4. 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

  1. Java-operators
  2. Java-opmerkingen
  3. Java if... else-instructie
  4. Java voor elke lus
  5. Java-onderbrekingsverklaring
  6. Java-strings
  7. Java-interface
  8. Java anonieme klasse
  9. Java proberen-met-bronnen
  10. Java-annotaties
  11. Java-vector