Assertions Java
Assertions Java
Dans ce didacticiel, nous allons découvrir l'instruction Java assert (assertions Java) à l'aide d'exemples.
Les assertions en Java aident à détecter les bogues en testant le code que nous supposons être vrai.
Une assertion est faite en utilisant le assert
mot-clé.
Sa syntaxe est :
assert condition;
Ici, condition
est une expression booléenne que nous supposons vraie lorsque le programme s'exécute.
Activation des assertions
Par défaut, les assertions sont désactivées et ignorées lors de l'exécution.
Pour activer les assertions, nous utilisons :
java -ea:arguments
OU
java -enableassertions:arguments
Lorsque les assertions sont activées et que la condition est true
, le programme s'exécute normalement.
Mais si la condition est évaluée à false
tandis que les assertions sont activées, JVM lance un AssertionError
, et le programme s'arrête immédiatement.
Exemple 1 :Assertion Java
class Main {
public static void main(String args[]) {
String[] weekends = {"Friday", "Saturday", "Sunday"};
assert weekends.length == 2;
System.out.println("There are " + weekends.length + " weekends in a week");
}
}
Sortie
There are 3 weekends in a week
Nous obtenons la sortie ci-dessus car ce programme n'a pas d'erreurs de compilation et par défaut, les assertions sont désactivées.
Après avoir activé les assertions, nous obtenons le résultat suivant :
Exception in thread "main" java.lang.AssertionError
Une autre forme d'énoncé d'assertion
assert condition : expression;
Dans cette forme d'instruction d'assertion, une expression est passée au constructeur du AssertionError
objet. Cette expression a une valeur qui s'affiche en tant que message détaillé de l'erreur si la condition est false
.
Le message détaillé est utilisé pour capturer et transmettre les informations de l'échec de l'assertion afin d'aider au débogage du problème.
Exemple 2 :Assertion Java avec exemple d'expression
class Main {
public static void main(String args[]) {
String[] weekends = {"Friday", "Saturday", "Sunday"};
assert weekends.length==2 : "There are only 2 weekends in a week";
System.out.println("There are " + weekends.length + " weekends in a week");
}
}
Sortie
Exception in thread "main" java.lang.AssertionError: There are only 2 weekends in a week
Comme nous le voyons dans l'exemple ci-dessus, l'expression est passée au constructeur du AssertionError
objet. Si notre hypothèse est false
et les assertions sont activées, une exception est levée avec un message approprié.
Ce message aide à diagnostiquer et à corriger l'erreur qui a provoqué l'échec de l'assertion.
Activer l'assertion pour des classes et des packages spécifiques
Si nous ne fournissons aucun argument aux commutateurs de ligne de commande d'assertion,
java -ea
Cela active les assertions dans toutes les classes à l'exception des classes système.
Nous pouvons également activer l'assertion pour des classes et des packages spécifiques à l'aide d'arguments. Les arguments pouvant être fournis à ces commutateurs de ligne de commande sont :
Activer l'assertion dans les noms de classe
Pour activer l'assertion pour toutes les classes de notre programme Main,
java -ea Main
Pour activer une seule classe,
java -ea:AnimalClass Main
Cela permet l'assertion uniquement dans le AnimalClass
dans le Main
programme.
Activer l'assertion dans les noms de packages
Pour activer les assertions pour le package com.animal
et ses sous-packages uniquement,
java -ea:com.animal... Main
Activer l'assertion dans les packages sans nom
Pour activer l'assertion dans des packages sans nom (lorsque nous n'utilisons pas d'instruction de package) dans le répertoire de travail actuel.
java -ea:... Main
Activer l'assertion dans les classes système
Pour activer l'assertion dans les classes système, nous utilisons un autre commutateur de ligne de commande :
java -esa:arguments
OU
java -enablesystemassertions:arguments
Les arguments pouvant être fournis à ces commutateurs sont les mêmes.
Désactivation des assertions
Pour désactiver les assertions, nous utilisons :
java -da arguments
OU
java -disableassertions arguments
Pour désactiver l'assertion dans les classes système, nous utilisons :
java -dsa:arguments
OU
java -disablesystemassertions:arguments
Les arguments qui peuvent être passés lors de la désactivation des assertions sont les mêmes que lors de leur activation.
Avantages de l'affirmation
- Rapide et efficace pour détecter et corriger les bugs.
- Les vérifications d'assertion sont effectuées uniquement pendant le développement et les tests. Ils sont automatiquement supprimés du code de production lors de l'exécution afin de ne pas ralentir l'exécution du programme.
- Cela permet de supprimer le code passe-partout et de rendre le code plus lisible.
- Refactorise et optimise le code avec une confiance accrue dans son bon fonctionnement
Quand utiliser les assertions
1. Codes inaccessibles
Les codes inaccessibles sont des codes qui ne s'exécutent pas lorsque nous essayons d'exécuter le programme. Utilisez des assertions pour vous assurer que les codes inaccessibles sont réellement inaccessibles.
Prenons un exemple.
void unreachableCodeMethod() {
System.out.println("Reachable code");
return;
// Unreachable code
System.out.println("Unreachable code");
assert false;
}
Prenons un autre exemple d'instruction switch sans cas par défaut.
switch (dayOfWeek) {
case "Sunday":
System.out.println("It’s Sunday!");
break;
case "Monday":
System.out.println("It’s Monday!");
break;
case "Tuesday":
System.out.println("It’s Tuesday!");
break;
case "Wednesday":
System.out.println("It’s Wednesday!");
break;
case "Thursday":
System.out.println("It’s Thursday!");
break;
case "Friday":
System.out.println("It’s Friday!");
break;
case "Saturday":
System.out.println("It’s Saturday!");
break;
}
L'instruction switch ci-dessus indique que les jours de la semaine ne peuvent être que l'une des 7 valeurs ci-dessus. N'avoir aucun cas par défaut signifie que le programmeur pense que l'un de ces cas sera toujours exécuté.
Cependant, il peut y avoir des cas qui n'ont pas encore été pris en compte où l'hypothèse est en fait fausse.
Cette hypothèse doit être vérifiée à l'aide d'une assertion pour s'assurer que le cas de commutation par défaut n'est pas atteint.
default:
assert false: dayofWeek + " is invalid day";
Si dayOfWeek a une valeur autre que les jours valides, un AssertionError
est lancé.
2. Documenter les hypothèses
Pour documenter leurs hypothèses sous-jacentes, de nombreux programmeurs utilisent des commentaires. Prenons un exemple.
if (i % 2 == 0) {
...
} else { // We know (i % 2 == 1)
...
}
Utilisez plutôt des assertions.
Les commentaires peuvent devenir obsolètes et désynchronisés à mesure que le programme se développe. Cependant, nous serons obligés de mettre à jour le assert
déclarations ; sinon, ils pourraient également échouer pour des conditions valides.
if (i % 2 == 0) {
...
} else {
assert i % 2 == 1 : i;
...
}
Quand ne pas utiliser les assertions
1. Vérification des arguments dans les méthodes publiques
Les arguments dans les méthodes publiques peuvent être fournis par l'utilisateur.
Ainsi, si une assertion est utilisée pour vérifier ces arguments, les conditions peuvent échouer et entraîner AssertionError
.
Au lieu d'utiliser des assertions, laissez-les générer les exceptions d'exécution appropriées et gérez ces exceptions.
2. Pour évaluer les expressions qui affectent le fonctionnement du programme
N'appelez pas de méthodes et n'évaluez pas d'exceptions susceptibles d'affecter ultérieurement le fonctionnement du programme dans les conditions d'assertion.
Prenons un exemple de liste jours de la semaine qui contient les noms de tous les jours d'une semaine.
ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ));
ArrayList<String> weekends= new ArrayList<>(Arrays.asList("Sunday", "Saturday" ));
assert weekdays.removeAll(weekends);
Ici, nous essayons de supprimer les éléments Saturday
et Sunday
de la ArrayList jours de la semaine .
Si l'assertion est activée, le programme fonctionne correctement. Cependant, si les assertions sont désactivées, les éléments de la liste ne sont pas supprimés. Cela peut entraîner un échec du programme.
Au lieu de cela, affectez le résultat à une variable, puis utilisez cette variable pour l'assertion.
ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ));
ArrayList<String> weekends= new ArrayList<>(Arrays.asList("Sunday", "Saturday" ));
boolean weekendsRemoved = weekdays.removeAll(weekends);
assert weekendsRemoved;
De cette façon, nous pouvons nous assurer que tous les week-ends sont supprimés des jours de semaine que l'assertion soit activée ou désactivée. Par conséquent, cela n'affecte pas le fonctionnement du programme à l'avenir.
Java