Frage

    

Diese Frage bereits eine Antwort hier:

         

Was macht assert? Zum Beispiel in der Funktion:

private static int charAt(String s, int d) {
    assert d >= 0 && d <= s.length();
    if (d == s.length()) return -1;
    return s.charAt(d);
}
War es hilfreich?

Lösung

Wenn Sie starten Sie Ihr Programm mit -enableassertions (oder -ea kurz) dann dieser Aussage

assert cond;

entspricht

if (!cond)
    throw new AssertionError();

Wenn Sie Ihr Programm ohne diese Option zu starten, wird die assert-Anweisung keine Wirkung hat.

Zum Beispiel assert d >= 0 && d <= s.length();, wie es in Ihrer Frage gestellt, entsprechen

if (!(d >= 0 && d <= s.length()))
    throw new AssertionError();

(Wenn Sie mit -enableassertions ins Leben gerufen, das ist.)


Formal ist die Java Language Specification : 14.10. Die assert Statement folgendes sagt:

  

14.10. Das assert Statement
   Eine Behauptung ist eine assert Anweisung einen Booleschen Ausdruck enthält. Eine Behauptung ist entweder aktiviert oder deaktiviert . Wenn die Behauptung aktiviert ist, wird die Ausführung der Behauptung verursacht Auswertung der Booleschen Ausdruck und ein Fehler gemeldet , wenn das Ergebnis des Ausdrucks zu false. Wenn die Behauptung deaktiviert ist, wird die Ausführung der Behauptung hat keinerlei Auswirkungen.

Wo "aktiviert oder deaktiviert" wird mit dem -ea Schalter gesteuert und "Ein Fehler wird berichtet," bedeutet, dass ein AssertionError geworfen wird.


Und schließlich, ein weniger bekanntes Merkmal assert:

Sie können den Parameter : "Error message" wie folgt aus:

assert d != null : "d is null";

angeben, was die Fehlermeldung des geworfenen AssertionError sein sollte.


Dieser Beitrag wurde bereits als Artikel neu geschrieben hier .

Andere Tipps

Wenn die Bedingung nicht erfüllt ist, wird eine AssertionError geworfen werden.

Assertions aktiviert werden müssen, obwohl; ansonsten der assert Ausdruck tut nichts. Siehe auch:

http: // java. sun.com/j2se/1.5.0/docs/guide/language/assert.html#enable-disable

assert ist ein Debugging-Tool, das das Programm verursacht eine AssertionFailed Ausnahme ausgelöst, wenn die Bedingung nicht wahr ist. In diesem Fall wird das Programm eine Ausnahme aus, wenn eine der beiden Bedingungen folgt es falsch zu bewerten. Im Allgemeinen assert nicht in Produktionscode verwendet werden soll

Obwohl ich viel Dokumentation über diese gelesen haben, ich bin verwirrend noch darüber, wie, wann und wo es zu benutzen.

Machen Sie es sehr einfach zu verstehen:

Wenn Sie eine ähnliche Situation wie folgt aus:

    String strA = null;
    String strB = null;
    if (2 > 1){
        strA = "Hello World";
    }

    strB = strA.toLowerCase(); 

Sie können erhalten Warnung (Anzeige gelbe Linie auf strB = strA.toLowerCase ();), dass strA könnte einen NULL-Wert zu strB erzeugen. Auch wenn Sie wissen, dass strB absolut ist, wird am Ende nicht null sein, nur für den Fall, verwenden Sie assert

1. Deaktivieren Sie die Warnung.

2. Werfen Ausnahmefehler IF Schlimmste, was passiert (wenn Sie Ihre Anwendung ausführen).

Manchmal, wenn Sie Ihren Code kompilieren, müssen Sie Ihr Ergebnis nicht bekommen, und es ist ein Fehler. Aber die Anwendung wird nicht abstürzen, und Sie verbringen eine sehr harte Zeit zu finden, wo ist dieser Fehler verursacht wird.

Also, wenn Sie behaupten setzen, wie folgt aus:

    assert strA != null; //Adding here
    strB = strA .toLowerCase();

Sie den Compiler sagen, dass strA ist absolut kein Null-Wert, kann es ruhig "die Warnung auszuschalten. WENN es NULL (worst case Fall ist), wird es die Anwendung beenden und einen Fehler zu Ihnen, es zu finden werfen.

  

Mit dieser Version der assert-Anweisung eine Detail Nachricht für die AssertionError bereitzustellen. Das System übergibt den Wert von Expression2 an den entsprechenden AssertionError Konstruktor, der die String-Darstellung des Wertes als der Fehler des Detail Nachricht verwendet.

     

Der Zweck der Detailmeldung ist zu erfassen und zu kommunizieren, um die Einzelheiten der Assertionsfehler. Die Nachricht sollte man diagnostizieren lassen und schließlich den Fehler zu beheben, die die Behauptung führten zum Scheitern verurteilt. Beachten Sie, dass die detaillierte Meldung keine Benutzerebene Fehlermeldung ist, so ist es in der Regel nicht notwendig, diese Botschaften in Isolation verständlich zu machen, oder sie zu internationalisieren. Die Detail Nachricht soll im Rahmen eines vollständigen Stack-Trace zu interpretieren, in Verbindung mit dem Quellcode die ausgefallenen Behauptung enthält.

JavaDoc

Assertions werden in der Regel in erster Linie als Mittel zur Überprüfung des Programms erwarteten Verhaltens verwendet. Es sollte in den meisten Fällen zu einem Absturz führen, da der Programmierer die Annahmen über den Zustand des Programms falsch sind. Dies ist, wo die Debug-Aspekt Behauptungen kommen in. Sie einen Kontrollpunkt schaffen, dass wir einfach nicht ignorieren, wenn wir das richtige Verhalten haben möchten.

In Ihrem Fall hat es die Datenvalidierung auf den eingehenden Parametern, obwohl es Kunden nicht daran hindert, aus der Funktion in der Zukunft zu mißbrauchen. Vor allem, wenn sie nicht sind, (und sollte nicht) werden, die in Release-Builds.

Es stellt sicher, dass der Ausdruck true zurückgibt. Andernfalls löst es eine java.lang.AssertionError.

http://java.sun.com /docs/books/jls/third_edition/html/statements.html#14.10

tut Assert eine AssertionError werfen, wenn Sie Ihre App mit Behauptungen laufen aktiviert.

int a = 42;
assert a >= 0 && d <= 10;

Wenn Sie dies mit laufen, sagen: java -ea -jar peiska.jar

Es ist ein java.lang.AssertionError

werfen
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top