English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutoriel de base Java

Contrôle de flux Java

Java Tableau

Java Programmation Orientée Objet (I)

Java Programmation Orientée Objet (II)

Java Programmation Orientée Objet (III)

Gestion des exceptions Java

Java Liste (List)

Java Queue (file d'attente)

Java Map Collection

Java Set Collection

Java Entrée/Sortie (I/O)

Java Reader/Writer

Autres sujets Java

Affirmations (Assert) Java

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.

Activer l'assertion

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.

Exemple1:Java 断言

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

Autre forme de déclaration d'assertion

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.

Exemple2:Exemple d'assertion Java avec 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");
  }
}

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.

Activer les assertions pour des classes et des packages spécifiques

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.

Désactiver les assertions

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.

Les avantages des assertions

  1. Détection et correction rapides et efficaces des erreurs.

  2. 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.

  3. Cela aide à supprimer le code de prototype et à rendre le code plus lisible.

  4. Refactoriser et optimiser le code pour renforcer la confiance dans son bon fonctionnement.

Quand utiliser des assertions

1.Code inatteignable

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.

2.Enregistrement des hypothèses

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;
    ...
}

Quand ne pas utiliser des assertions

1.Vérification des paramètres dans les méthodes publiques

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.

2.Évaluation des expressions qui affectent le fonctionnement du programme

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.