Was sind einige Beispiele aus der Praxis die Schlüsselrolle von Behauptungen zu verstehen?
Antworten
Zu viele Anzeigen?Assertion werden grundsätzlich verwendet, um die Anwendung zu debuggen oder es wird als Ersatz für die Ausnahmebehandlung für einige Anwendungen verwendet, um die Gültigkeit einer Anwendung zu überprüfen.
Assertion funktioniert zur Laufzeit. Ein einfaches Beispiel, das das ganze Konzept sehr einfach erklären kann, ist hier - _Welche Funktion hat das Schlüsselwort assert in Java?_ (WikiAnswers).
Assertions sind standardmäßig deaktiviert. Um sie zu aktivieren, müssen wir das Programm mit -ea
Optionen (Granularität kann variiert werden). Zum Beispiel, java -ea AssertionsDemo
.
Es gibt zwei Formate für die Verwendung von Assertions:
- Einfach: z. B.
assert 1==2; // This will raise an AssertionError
. - Besser:
assert 1==2: "no way.. 1 is not equal to 2";
Dies führt zu einem AssertionError, bei dem die angegebene Meldung ebenfalls angezeigt wird, und ist daher besser. Obwohl die eigentliche Syntax lautetassert expr1:expr2
wobei expr2 ein beliebiger Ausdruck sein kann, der einen Wert zurückgibt, ich habe es häufiger verwendet, um eine Nachricht zu drucken.
Ich weiß nicht, welche Geschichte sich hinter dieser Funktion in Java verbirgt. Aber ich habe eine Vorstellung davon, was assert
verwendet werden können, die meines Erachtens in diesem Thread noch nicht angesprochen wurden.
Angenommen, Sie haben eine Aufzählung, die Sie einschalten:(†)
public enum Veggie {
CAULIFLOWER,
CARROT,
}
// Another class
switch (veggie) {
case CAULIFLOWER: value = 5;
case CARROT: value = 3;
}
†: Vielleicht werden gute Java-Compiler/Tools fehlende Enum-Werte statisch erkennen. In diesem Fall stellen Sie sich einfach vor, Sie finden einen Fehler und beheben ihn. Dann können Sie einen Regressionstest in den eigentlichen Code einfügen, indem Sie die unten beschriebene Technik anwenden.
Es gibt keine guten Standard Fall für diese. Sie sollten also wirklich sicherstellen, dass Sie alle Werte abdecken. Sie sollten sicherstellen, dass Sie den Switch-Block aktualisieren, wenn Sie eine neue Enum-Variante hinzufügen:
public enum Veggie {
CAULIFLOWER,
CARROT,
TOMATO,
}
Es stellt sich jedoch heraus, dass dieser Code genau dann aufgerufen wird, wenn der Benutzer eine bestimmte Ansicht in Ihrer Webanwendung lädt. Und die Ansicht kann trotz dieses Fehlers bestehen bleiben: Es wäre ein Fehler, aber es lohnt sich nicht, das Laden der Ansicht zu stören (sagen wir, dass dem Benutzer nur ein paar falsche Zahlen angezeigt werden). Sie protokollieren also einfach eine Warnung:
switch (veggie) {
case CAULIFLOWER: value = 5;
case CARROT: value = 3;
default: nonExhaustiveMatchOnEnum();
// […]
public static void nonExhaustiveMatchOnEnum() {
String errorMessage: "Missing veggie";
logger.warn(errorMessage);
}
Aber Sie tun Sie als Entwickler können einen solchen Fehler in fünf Minuten beheben, im Gegensatz zu den Benutzern Ihrer Webanwendung.
Sie können also einfach eine assert false
:
public static void nonExhaustiveMatchOnEnum() {
String errorMessage: "Missing veggie";
assert false : errorMessage;
logger.warn(errorMessage);
}
Jetzt wird die Anwendung lokal abstürzen, aber in der Produktion nur eine Warnung protokollieren (vorausgesetzt, Sie verwenden java -ea
lokal, aber nicht in der Produktion).
Grundsätzlich gilt, dass "assert true" funktioniert und "assert false" nicht. Schauen wir uns an, wie das funktionieren soll:
public static void main(String[] args)
{
String s1 = "Hello";
assert checkInteger(s1);
}
private static boolean checkInteger(String s)
{
try {
Integer.parseInt(s);
return true;
}
catch(Exception e)
{
return false;
}
}
assert
ist ein Schlüsselwort. Es wurde im JDK 1.4 eingeführt. Es gibt zwei Arten von assert
s
- Sehr einfach
assert
Aussagen - Einfach
assert
Erklärungen.
Standardmäßig werden alle assert
Anweisungen werden nicht ausgeführt. Wenn eine assert
Anweisung false erhält, wird automatisch ein Behauptungsfehler ausgelöst.
- See previous answers
- Weitere Antworten anzeigen