Qu'est-ce que le mot-clé « assert » faire? [dupliquer]
Question
Cette question a déjà une réponse ici:
Qu'est-ce assert
faire?
Par exemple, dans la fonction:
private static int charAt(String s, int d) {
assert d >= 0 && d <= s.length();
if (d == s.length()) return -1;
return s.charAt(d);
}
La solution
Si vous lancez votre programme avec -enableassertions
(ou -ea
pour faire court), alors cette déclaration
assert cond;
est équivalent à
if (!cond)
throw new AssertionError();
Si vous lancez votre programme sans cette option, l'instruction assert aura aucun effet.
Par exemple, assert d >= 0 && d <= s.length();
, telle que publiée dans votre question, équivaut à
if (!(d >= 0 && d <= s.length()))
throw new AssertionError();
(Si vous avez lancé avec -enableassertions
qui est.)
Formellement, le Java Language Specification : 14.10. La déclaration de assert
dit ce qui suit:
14,10. La déclaration de
assert
Une assertion est une déclarationassert
contenant une expression booléenne. Une assertion est activé ou désactivé . Si l'affirmation est activée, l'exécution de l'affirmation provoque l'évaluation de l'expression booléenne et une erreur est signalée Si l'expression àfalse
. Si l'affirmation est désactivée, l'exécution de l'assertion n'a pas que ce soit l'effet.
Où "activé ou désactivé" est contrôlé avec le commutateur -ea
et "Une erreur est signalée" signifie qu'une AssertionError
est levée.
Et enfin, une caractéristique moins connue de assert
:
Vous pouvez ajouter : "Error message"
comme ceci:
assert d != null : "d is null";
pour spécifier ce que le message d'erreur de la AssertionError doit être jeté.
Autres conseils
Si la condition est pas satisfaite, une AssertionError
sera levée.
Assertions doivent être activées, cependant; sinon l'expression de assert
ne fait rien. Voir:
http: // java. sun.com/j2se/1.5.0/docs/guide/language/assert.html#enable-disable
assert
est un outil de débogage qui forcera le programme à lancer une exception AssertionFailed
si la condition est pas vrai. Dans ce cas, le programme lancera une exception si l'une des deux conditions suivantes il évaluer false. D'une manière générale, assert
ne doit pas être utilisé dans le code de production
Bien que j'ai lu une documentation beaucoup sur celui-ci, je suis encore confus sur comment, quand et où l'utiliser.
il est très simple à comprendre:
Quand vous avez une situation similaire à ceci:
String strA = null;
String strB = null;
if (2 > 1){
strA = "Hello World";
}
strB = strA.toLowerCase();
Vous pouvez recevoir d'avertissement (affichage ligne jaune sur strB = strA.toLowerCase ();) que strA pourrait produire une valeur NULL à strB. Bien que vous savez que strB est absolument ne sera pas nulle à la fin, juste au cas où, vous utilisez assert à
1. Désactiver l'avertissement.
2. Jeter erreur d'exception si pire chose arrive (lorsque vous exécutez votre application).
Parfois, lorsque vous compilez votre code, vous ne recevez pas votre résultat et c'est un bug. Mais l'application ne plantera pas, et vous passer un moment très difficile de trouver où est l'origine de ce bogue.
Alors, si vous mettez assert, comme ceci:
assert strA != null; //Adding here
strB = strA .toLowerCase();
vous dire au compilateur que strA est absolument pas une valeur nulle, elle peut « pacifiquement » éteindre l'avertissement. S'il est NULL (pire des cas se produit), il arrête l'application et jeter un bug à vous localiser.
Cette version de l'instruction assert pour fournir un message détaillé pour le AssertionError. Le système passe la valeur de Expression2 au constructeur de AssertionError approprié, qui utilise la représentation de chaîne de la valeur en tant que message de détail de l'erreur.
Le but du message de détail est de saisir et de communiquer les détails de l'échec d'assertion. Le message devrait vous permettre de diagnostiquer et finalement corriger l'erreur qui a conduit l'affirmation à l'échec. Notez que le message de détail n'est pas un message d'erreur au niveau utilisateur, il est donc généralement pas nécessaire de rendre ces messages compréhensibles dans l'isolement, ou de les internationaliser. Le message de détail est destiné à être interprété dans le contexte d'une trace complète de la pile, conjointement avec le code source contenant l'assertion a échoué.
Affirmations sont généralement utilisés principalement comme un moyen de vérifier le comportement attendu du programme. Elle devrait conduire à un accident dans la plupart des cas, étant donné que les hypothèses du programmeur sur l'état du programme sont fausses. C'est là l'aspect le débogage des affirmations entrent en jeu. Ils créent un point de contrôle que nous ne pouvons tout simplement pas ignorer si nous voulons avoir un comportement correct.
Dans votre cas, il fait la validation des données sur les paramètres entrants, mais il n'empêche pas les clients d'utiliser abusivement la fonction dans l'avenir. Surtout si elles ne sont pas, (et ne doit pas) être inclus dans la version construit.
Il veille à ce que l'expression renvoie true. Dans le cas contraire, il jette un java.lang.AssertionError
.
http://java.sun.com /docs/books/jls/third_edition/html/statements.html#14.10
Assertion ne jette un AssertionError si vous exécutez votre application avec des affirmations sous tension.
int a = 42;
assert a >= 0 && d <= 10;
Si vous exécutez ce avec, par exemple: java -ea jar peiska.jar
Il est interdit de jeter un java.lang.AssertionError