web-dev-qa-db-fra.com

Que fait le mot clé "assert"?

Que fait assert? 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);
}
134
Peiska

Si vous lancez votre programme avec -enableassertions (Ou -ea En abrégé), cette déclaration

assert cond;

est équivalent à

if (!cond)
    throw new AssertionError();

Si vous lancez votre programme sans cette option, la déclaration d'assertion n'aura aucun effet.

Par exemple, assert d >= 0 && d <= s.length();, tel que posté dans votre question, équivaut à

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

(Si vous avez lancé avec -enableassertions C'est.)


Formellement, le Spécification du langage Java: 14.10. Le assert Instruction dit ce qui suit:

14.10. Le assert Statement
Une assertion est une instruction assert contenant une expression booléenne. Une assertion est activée ou désactivée . Si l'assertion est activée, son exécution entraîne l'évaluation de l'expression booléenne et une erreur est signalée si l'expression est évaluée à false. . Si l'assertion est désactivée, son exécution n'a aucun effet.

"activé ou désactivé" est contrôlé à l'aide du commutateur -ea Et "Une erreur est signalée" signifie qu'un AssertionError Est lancé.


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 le message d'erreur de l'assertionError renvoyée.


Cet article a été réécrit sous forme d'article ici .

227
aioobe

Si la condition n'est pas satisfaite, un AssertionError sera lancé.

Les assertions doivent être activées, cependant; sinon, l'expression assert ne fait rien. Voir:

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

12
Richard Fearn

Bien que j'ai lu beaucoup de documentation sur celui-ci, je ne comprends toujours pas comment, quand et où l'utiliser.

Rendez-le très simple à comprendre:

Lorsque vous avez une situation similaire comme celle-ci:

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

    strB = strA.toLowerCase(); 

Vous pourriez recevoir un avertissement (affichant une ligne jaune sur strB = strA.toLowerCase ();) que strA peut produire une valeur NULL pour strB. Bien que vous sachiez que strB n’est absolument pas nul en fin de compte, juste au cas où, vous utiliseriez assert pour

1. Désactiver l'avertissement.

2. Erreur d'exception de projection SI la pire chose se produit (lorsque vous exécutez votre application).

Parfois, lorsque vous compilez votre code, vous n'obtenez pas votre résultat et c'est un bogue. Mais l'application ne va pas planter et vous passez beaucoup de temps à trouver où est la cause de ce bogue.

Donc, si vous mettez assert, comme ceci:

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

vous dites au compilateur que strA n'est absolument pas une valeur nulle, il peut "pacifiquement" désactiver l'avertissement. Si c'est NULL (le pire des cas se produit), il va arrêter l'application et vous jeter un bogue pour le localiser.

5
felixwcf

assert est un outil de débogage qui fera que le programme lève une exception AssertionFailed si la condition n'est pas vraie. Dans ce cas, le programme lève une exception si l'une des deux conditions qui la suivent est évaluée comme fausse. D'une manière générale, assert ne devrait pas être utilisé dans le code de production

5
Chris Thompson

Les assertions sont généralement utilisées principalement pour vérifier le comportement attendu du programme. Cela devrait conduire à un crash dans la plupart des cas, car les suppositions du programmeur sur l'état du programme sont fausses. C'est là qu'intervient l'aspect de débogage des assertions. Elles créent un point de contrôle que nous ne pouvons tout simplement pas ignorer si nous souhaitons avoir un comportement correct.

Dans votre cas, la validation des données sur les paramètres entrants est validée, mais cela n’empêche pas les clients d’utiliser la fonction à mauvais escient. Surtout s'ils ne le sont pas (et ne devraient pas) être inclus dans les versions validées.

1
Zoli

Utilisez cette version de l'instruction assert pour fournir un message de détail pour AssertionError. Le système transmet la valeur de Expression2 au constructeur AssertionError approprié, qui utilise la représentation sous forme 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 capturer et de communiquer les détails de l'échec de l'assertion. Le message doit vous permettre de diagnostiquer et finalement de réparer l'erreur à l'origine de l'échec de l'assertion. Notez que le message de détail n'est pas un message d'erreur de niveau utilisateur. Il est donc généralement inutile de rendre ces messages compréhensibles de manière isolée ou de les internationaliser. Le message de détail est destiné à être interprété dans le contexte d'une trace de pile complète, en association avec le code source contenant l'assertion ayant échoué.

JavaDoc

1
Jan Kuboschek

Cela garantit que l'expression retourne vraie. Sinon, il jette un Java.lang.AssertionError.

http://Java.Sun.com/docs/books/jls/third_edition/html/statements.html#14.1

0
Brett Kail

Assert génère une erreur AssertionError si vous exécutez votre application avec les assertions activées.

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

Si vous exécutez ceci avec, dites: Java -ea -jar peiska.jar

Il lancera un Java.lang.AssertionError

0
NoozNooz42