Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> Java

Java-Assertionen

Java-Zusicherungen

In diesem Tutorial lernen wir die Java-Assert-Anweisung (Java-Assertions) anhand von Beispielen kennen.

Behauptungen in Java helfen beim Erkennen von Fehlern, indem sie Code testen, von dem wir annehmen, dass er wahr ist.

Eine Zusicherung erfolgt mit dem assert Schlüsselwort.

Seine Syntax ist:

assert condition;

Hier, condition ist ein boolescher Ausdruck, von dem wir annehmen, dass er wahr ist, wenn das Programm ausgeführt wird.


Zusicherungen aktivieren

Standardmäßig sind Zusicherungen deaktiviert und werden zur Laufzeit ignoriert.

Um Behauptungen zu ermöglichen, verwenden wir:

java -ea:arguments

ODER

java -enableassertions:arguments

Wenn Zusicherungen aktiviert sind und die Bedingung true ist , wird das Programm normal ausgeführt.

Aber wenn die Bedingung zu false ausgewertet wird während Zusicherungen aktiviert sind, gibt JVM einen AssertionError aus , und das Programm stoppt sofort.


Beispiel 1:Java-Assertion

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

Ausgabe

There are 3 weekends in a week

Wir erhalten die obige Ausgabe, da dieses Programm keine Kompilierungsfehler aufweist und Behauptungen standardmäßig deaktiviert sind.

Nach dem Aktivieren von Zusicherungen erhalten wir die folgende Ausgabe:

Exception in thread "main" java.lang.AssertionError

Eine andere Form der Assertion-Anweisung

assert condition : expression;

Bei dieser Form der Assertionsanweisung wird ein Ausdruck an den Konstruktor von AssertionError übergeben Objekt. Dieser Ausdruck hat einen Wert, der als Detailmeldung des Fehlers angezeigt wird, wenn die Bedingung false ist .

Die detaillierte Nachricht wird verwendet, um die Informationen über den Behauptungsfehler zu erfassen und zu übertragen, um beim Debuggen des Problems zu helfen.


Beispiel 2:Java-Assertion mit Beispielausdruck

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

Ausgabe

Exception in thread "main" java.lang.AssertionError: There are only 2 weekends in a week

Wie wir im obigen Beispiel sehen, wird der Ausdruck an den Konstruktor von AssertionError übergeben Objekt. Wenn unsere Annahme false ist und Zusicherungen aktiviert sind, wird eine Ausnahme mit einer entsprechenden Nachricht ausgelöst.

Diese Nachricht hilft bei der Diagnose und Behebung des Fehlers, der zum Fehlschlagen der Assertion geführt hat.


Assertion für bestimmte Klassen und Pakete aktivieren

Wenn wir keine Argumente für die Assertion-Befehlszeilenschalter bereitstellen,

java -ea

Dies ermöglicht Zusicherungen in allen Klassen außer Systemklassen.

Wir können die Assertion auch für bestimmte Klassen und Pakete mithilfe von Argumenten aktivieren. Die Argumente, die diesen Befehlszeilenoptionen bereitgestellt werden können, sind:

Assertion in Klassennamen aktivieren

Um Assertion für alle Klassen unseres Programms Main zu aktivieren,

java -ea Main

Um nur eine Klasse zu aktivieren,

java -ea:AnimalClass Main

Dies ermöglicht die Assertion nur in AnimalClass im Main Programm.

Assertion in Paketnamen aktivieren

Zusicherungen für Paket com.animal aktivieren und nur seine Unterpakete,

java -ea:com.animal... Main

Assertion in unbenannten Paketen aktivieren

Um die Assertion in unbenannten Paketen (wenn wir keine Paketanweisung verwenden) im aktuellen Arbeitsverzeichnis zu aktivieren.

java -ea:... Main

Assertion in Systemklassen aktivieren

Um die Assertion in Systemklassen zu aktivieren, verwenden wir einen anderen Befehlszeilenschalter:

java -esa:arguments 

ODER

java -enablesystemassertions:arguments

Die Argumente, die diesen Schaltern zur Verfügung gestellt werden können, sind die gleichen.


Assertionen deaktivieren

Um Behauptungen zu deaktivieren, verwenden wir:

java -da arguments 

ODER

java -disableassertions arguments

Um die Assertion in Systemklassen zu deaktivieren, verwenden wir:

java -dsa:arguments

ODER

java -disablesystemassertions:arguments

Die Argumente, die beim Deaktivieren von Behauptungen übergeben werden können, sind die gleichen wie beim Aktivieren.


Vorteile der Behauptung

  1. Schnell und effizient zum Erkennen und Korrigieren von Fehlern.
  2. Assertionsprüfungen werden nur während der Entwicklung und beim Testen durchgeführt. Sie werden zur Laufzeit automatisch im Produktionscode entfernt, damit die Ausführung des Programms nicht verlangsamt wird.
  3. Es hilft, Boilerplate-Code zu entfernen und den Code besser lesbar zu machen.
  4. Refaktorisiert und optimiert Code mit erhöhter Gewissheit, dass er korrekt funktioniert.

Wann man Behauptungen verwendet

1. Nicht erreichbare Codes

Nicht erreichbare Codes sind Codes, die nicht ausgeführt werden, wenn wir versuchen, das Programm auszuführen. Verwenden Sie Zusicherungen, um sicherzustellen, dass nicht erreichbare Codes tatsächlich nicht erreichbar sind.

Nehmen wir ein Beispiel.

void unreachableCodeMethod() {
  System.out.println("Reachable code");
  return;
  // Unreachable code
  System.out.println("Unreachable code");
  assert false;
}

Nehmen wir ein weiteres Beispiel für eine switch-Anweisung ohne default 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;
}

Die obige switch-Anweisung gibt an, dass die Wochentage nur einer der obigen 7 Werte sein können. Kein Standardfall zu haben bedeutet, dass der Programmierer glaubt, dass immer einer dieser Fälle ausgeführt wird.

Es kann jedoch einige Fälle geben, die noch nicht berücksichtigt wurden, in denen die Annahme tatsächlich falsch ist.

Diese Annahme sollte mit einer Assertion überprüft werden, um sicherzustellen, dass der Standard-Switch-Case nicht erreicht wird.

default:
    assert false: dayofWeek + " is invalid day";

Wenn dayOfWeek hat einen anderen Wert als die gültigen Tage, eine AssertionError wird geworfen.


2. Annahmen dokumentieren

Um ihre zugrunde liegenden Annahmen zu dokumentieren, verwenden viele Programmierer Kommentare. Nehmen wir ein Beispiel.

if (i % 2 == 0) {
    ...
} else { // We know (i % 2 == 1)
    ...
}

Verwenden Sie stattdessen Behauptungen.

Kommentare können veraltet und nicht mehr synchron sein, wenn das Programm wächst. Wir werden jedoch gezwungen sein, den assert zu aktualisieren Aussagen; andernfalls könnten sie auch für gültige Bedingungen fehlschlagen.

if (i % 2 == 0) {
   ...
} else {
    assert i % 2 == 1 : i;
    ...
}

Wann man Behauptungen nicht verwenden sollte

1. Argumentprüfung in öffentlichen Methoden

Argumente in öffentlichen Methoden können vom Benutzer bereitgestellt werden.

Wenn also eine Assertion verwendet wird, um diese Argumente zu überprüfen, können die Bedingungen fehlschlagen und zu AssertionError führen .

Anstatt Zusicherungen zu verwenden, lassen Sie es zu den entsprechenden Laufzeitausnahmen führen und behandeln Sie diese Ausnahmen.


2. Um Ausdrücke auszuwerten, die den Programmablauf beeinflussen

Rufen Sie keine Methoden auf und werten Sie keine Ausnahmen aus, die sich später auf die Programmoperation in Zusicherungsbedingungen auswirken können.

Nehmen wir als Beispiel eine Liste Wochentage die die Namen aller Tage einer Woche enthält.


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 versuchen wir, die Elemente Saturday zu entfernen und Sunday aus der ArrayList Wochentage .

Wenn die Assertion aktiviert ist, funktioniert das Programm einwandfrei. Wenn Assertionen jedoch deaktiviert sind, werden die Elemente nicht aus der Liste entfernt. Dies kann zu Programmfehlern führen.

Weisen Sie stattdessen das Ergebnis einer Variablen zu und verwenden Sie diese Variable dann für die Assertion.

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;

Auf diese Weise können wir sicherstellen, dass alle Wochenenden werden aus den Wochentagen entfernt unabhängig davon, ob die Assertion aktiviert oder deaktiviert ist. Dadurch wird der Programmbetrieb in Zukunft nicht beeinträchtigt.


Java

  1. Java-Operatoren
  2. Java-Kommentare
  3. Java if...else-Anweisung
  4. Java for-each-Schleife
  5. Java-Strings
  6. Java-Schnittstelle
  7. Anonyme Java-Klasse
  8. Java-Versuch-mit-Ressourcen
  9. Java-Anmerkungen
  10. Java-Vektor