2009-07-17 7 views
3

que devrait faire le code java suivant?java assert donne des résultats étranges

public class foo{ 
    public static void main(String[] args){ 
     boolean mybool=false; 
     assert (mybool==true); 
    } 
} 

Est-ce que cela devrait renvoyer une erreur d'assertion? et si non, pourquoi pas? (Je ne reçois aucune erreur!)

Répondre

0

Ceci devrait être lancer AssertionErors.

Vous devez activer les assertions si vous utilisez Eclipse. Il les a désactivés par défaut.

Pour ce faire, ajoutez -ea aux arguments JVM.

+1

ajouter un -ea à l'exécution du VM –

+0

Bah .... accepté avant que n'importe qui ait une chance de répondre. – skaffman

+0

2 personnes ont eu la chance de répondre ... – jjnguy

4

Lors de l'exécution du programme, vous devez activer les assertions dans la machine virtuelle Java en ajoutant « -ea » à la ligne de commande:

java -ea -jar myprogram.jar 
+1

Merci les gars! Je l'ai fait fonctionner comme il se doit! Bravo pour les réponses super rapides! –

1

affirmations du langage Java sont bizarres. Vous devez les activer lorsque vous lancez la ligne de commande, et je n'aime pas ça.

Pour cette raison, j'ai tendance à utiliser des bibliothèques tierces pour faire mes assertions. Apache Commons Lang (via la classe Validator), Spring (via la classe Assert) ou même JUnit4 (via la classe Assert) fournissent tous cette fonctionnalité et fonctionnent indépendamment des paramètres de VM. Lorsque vous utilisez des importations statiques Java5, elles sont aussi faciles à utiliser que java assert, plus elles sont plus flexibles, et elles vous permettent de spécifier le message d'erreur dans l'exception.

+0

La valeur par défaut est ennuyante, mais est là pour la rétrocompatibilité; Pour les autres choses: vous pouvez également spécifier le message avec les assertions java, et ils sont garantis afaik pour être supprimés du code byte quand ils ne sont pas utilisés. Cela signifie que vous n'avez pas à vous soucier des performances de production. Je doute que cela soit possible avec une bibliothèque tierce –

+0

Vrai, mais la pénalité de performance pour vérifier ces choses est complètement insignifiante sur une machine virtuelle moderne. – skaffman

+0

Vous pouvez placer des assertions de poids fort dans les assertions de langage et savoir qu'elles seront supprimées dans un déploiement de production. Les assertions ne sont pas supprimées du bytecode, la machine virtuelle les compile juste au moment de l'exécution en fonction des indicateurs. –

0

Ceci rend l'information si les assertions sont activées accessibles dans le programme.

Si les assertions sont désactivées (c'est la valeur par défaut), l'instruction d'assertion ne sera pas exécutable, et mybool aura la valeur false.

si les assertions sont activées (argument jvm -ea), l'assertion sera exécutée et, par effet secondaire, mybool sera défini sur true.

Vous pouvez l'utiliser pour imposer l'activation ou la désactivation des assertions. Par exemple, j'ai un test dans mes TestSuites qui échoue si les assertions ne sont pas activées, afin de s'assurer que les assertions sont toujours activées lors des tests.

Questions connexes