English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Dans ce tutoriel, nous allons apprendre les instructions assert en Java (Java assertion) à l'aide d'exemples.
Dans Java, les assertions aident à détecter les erreurs en testant le code que nous considérons comme correct.
Utiliser le mot-clé assert pour faire une assertion.
Sa syntaxe est :
assert condition;
Ici, condition est une expression booléenne, nous supposons qu'elle est vraie au moment de l'exécution du programme.
Par défaut, les assertions sont désactivées au moment de l'exécution et ignorées.
Pour activer l'assertion, nous utilisons :
java -ea:arguments
ou
java -enableassertions:arguments
Lorsque l'assertion est activée et que la condition est true, le programme s'exécute normalement.
Mais si, lors de l'activation de l'assertion et si la condition est calculée comme false, le JVM lève une AssertionError et le programme s'arrête immédiatement.
class Main { public static void main(String args[]) { String[] weekends = {"Friday", "Saturday", "Sunday"}; assert weekends.length == 2; System.out.println("Cette semaine il y a " + weekends.length + "weekends in a week"); } }
Résultat de la sortie
Cette semaine il y a 3 weekends
Nous obtenons ce résultat car le programme n'a pas d'erreurs de compilation et les assertions sont désactivées par défaut.
Après avoir activé les assertions, nous obtenons le suivant en sortie :
Exception in thread "main" java.lang.AssertionError
assert condition : expression;
Dans cette forme de phrase d'assertion, l'expression est passée au constructeur de l'objet AssertionError. Si la condition est fausse, la valeur de l'expression est affichée comme détail d'erreur.
Un message détaillé est utilisé pour capturer et transmettre des informations sur l'échec des assertions pour aider à déboguer les problèmes.
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"); } }
Résultat de la sortie
Exception in thread "main" java.lang.AssertionError: There are only 2 weekends in a week
Comme nous pouvons le voir dans l'exemple ci-dessus, l'expression est passée au constructeur de l'objet AssertionError. Si notre hypothèse est fausse et que les assertions sont activées, une exception est lancée et un message approprié est affiché.
Ce message aide à diagnostiquer et à corriger les erreurs qui causent l'échec des assertions.
Si nous ne fournissons pas de paramètres à l'option de ligne de commande d'assertion
java -ea
Cela activera les assertions dans toutes les classes, sauf les classes système.
Nous pouvons également utiliser des paramètres spécifiques pour activer les assertions pour des classes et des packages spécifiques. Les paramètres disponibles pour ces options de ligne de commande sont :
Activer les assertions dans le nom de la classe
Pour activer les assertions pour toutes les classes du programme Main
java -ea Main
Neuromancer
java -ea:AnimalClass Main
Cela ne permet que l'utilisation des assertions dans la classe AnimalClass du programme Main.
Activer les assertions dans le nom du paquet
Activer les assertions pour le paquet com.animal et ses sous-paquets
java -ea:com.animal... Main
Activer les assertions dans le paquet anonyme
Activer les assertions dans le paquet anonyme du répertoire de travail actuel (lorsque nous ne n utilisons pas la directive package).
java -ea:... Main
Activer les assertions dans les classes système
Pour activer les assertions dans les classes système, nous utilisons des commandes d'invite de commande différentes :
java -esa:arguments
ou
java -enablesystemassertions:arguments
Les paramètres que l'on peut fournir à ces interrupteurs sont les mêmes.
Pour désactiver les assertions, nous utilisons :
java -da arguments
ou
java -disableassertions arguments
Pour désactiver les assertions dans les classes système, nous utilisons :
java -dsa:arguments
ou
java -disablesystemassertions:arguments
Les arguments passés lorsque les assertions sont désactivées sont les mêmes que ceux passés lorsque les assertions sont activées.
Détection et correction rapides et efficaces des erreurs.
Les assertions ne sont vérifiées que pendant le développement et les tests. Elles sont automatiquement supprimées du code de production au moment de l'exécution, ce qui ne ralentit pas l'exécution du programme.
Cela aide à supprimer le code de prototype et à rendre le code plus lisible.
Refactoriser et optimiser le code pour renforcer la confiance dans son bon fonctionnement.
Le code inatteignable est le code qui ne sera pas exécuté lorsque nous essayons de faire fonctionner ce programme. Utilisons des assertions pour nous assurer que le code inatteignable est vraiment inatteignable.
Laissez-nous prendre un exemple.
void unreachableCodeMethod() { System.out.println("Code atteignable"); return; // Code inatteignable System.out.println("Code inatteignable"); assert false; }
Laissez-nous examiner un exemple de statement switch sans cas par défaut.
switch (dayOfWeek) { case "dimanche": System.out.println("C'est dimanche !"); break; case "lundi": System.out.println("C'est lundi !"); break; case "mardi": System.out.println("C'est mardi !"); break; case "Wednesday": System.out.println("C'est mercredi !"); break; case "Thursday": System.out.println("C'est jeudi !"); break; case "Friday": System.out.println("C'est vendredi !"); break; case "Saturday": System.out.println("C'est samedi !"); break; }
L'instruction switch ci-dessus indique que les jours de la semaine ne peuvent être que les suivants7une valeur. Il n'y a pas de cas par défaut signifie que le programmeur croit qu'une de ces situations sera toujours exécutée.
Mais, dans certains cas où certaines hypothèses sont effectivement erronées, certaines situations peuvent ne pas avoir été prises en compte.
Il devrait utiliser des assertions pour vérifier cette hypothèse pour s'assurer qu'aucune condition de switch par défaut n'est atteinte.
default: assert false: dayofWeek + " est un jour invalide";
Lancer un AssertionError si la valeur de dayOfWeek n'est pas une date valide.
Pour enregistrer leurs hypothèses de base, de nombreux programmeurs utilisent des commentaires. Laissons-nous en donner un exemple.
if (i % 2 == 0) { ... } else { // Nous savons que (i % 2 == 1) ... }
Veuillez utiliser des assertions.
Avec l'augmentation du programme, les commentaires peuvent devenir obsolètes et désynchronisés. Cependant, nous devrons mettre à jour les instructions assert; sinon, elles pourraient échouer en raison de conditions valides.
if (i % 2 == 0) { ... } else { assert i % 2 == 1 : i; ... }
L'utilisateur peut fournir des paramètres dans des méthodes publiques.
Par conséquent, si des assertions sont utilisées pour vérifier ces paramètres, les conditions pourraient échouer et entraîner un AssertionError.
Au lieu d'utiliser des assertions, mieux vaut qu'elles génèrent des exceptions de temps d'exécution appropriées et traitent ces exceptions.
Ne pas appeler une méthode ou évaluer une exception qui pourrait affecter le fonctionnement du programme dans des conditions d'assertion.
Prenez un exemple de tableau pour illustrer, la liste weekdays contient les noms de tous les jours de la 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 l'ArrayList weekdays.
Si l'assertion est activée, le programme peut fonctionner normalement. Cependant, si l'assertion est désactivée, les éléments de la liste ne seront pas supprimés. Cela pourrait entraîner l'échec du programme.
Instead, assign the result to a variable and then use that variable for assertions.
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;
In this way, we can ensure that all weekends are removed from weekdays, regardless of whether assertions are enabled or disabled. As a result, it will not affect future program operations.