Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Industrial programming >> Java

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

  1. Rapide et efficace pour détecter et corriger les bugs.
  2. 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.
  3. Cela permet de supprimer le code passe-partout et de rendre le code plus lisible.
  4. 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

  1. Opérateurs Java
  2. Commentaires Java
  3. Java pour chaque boucle
  4. Chaînes Java
  5. InterfaceJava
  6. Classe anonyme Java
  7. Java essayer avec des ressources
  8. Annotations Java
  9. Java vecteur