Accès rapide :
La vidéo
Cette vidéo vous montre comment utiliser les assertions en Java.
Une assertion permet de vérifier une condition considérée comme vraie. Si cette condition est vraie, alors l'assertion sera muette. Si elle est fausse,
alors une erreur sera produite. Une assertion s'introduit via le mot clé assert
et elle est suivie de la condition à vérifier et
éventuellement d'un message d'erreur. Voici un exemple d'utilisation d'assertion.
1 2 3 4 5 6 7 8 9 10 11 |
public class Demo { public static void main( String [] args ) { assert args.length > 0; System.out.println( "La valeur du premier paramètre est : " + args[0] ); } } |
$> javac Demo.java $> java Demo Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at Demo.main(Demo.java:7) $>
Comme vous le constatez, l'assertion est ignorée est le programme se plante sur la ligne 7, quand il tente d'accéder au permier paramètre, ici inexistant. Du coup, la question que vous devez être en train de vous poser est : « mais comment activer ces assertions ? »
Comme nous venons de le dire, par défaut, les assertions ne son pas vérifiées par la JVM : elle ne génère pas le code machine natif (pour le processeur hôte) nécessaire à leurs exécutions. Pour les activer, il vous fournir une option de la JVM lors du démarrage de cette dernière.
En fait, il y a deux options possibles : soit l'option courte -ea
, soit l'option longue -enableassertions
. Dans les deux cas,
vous pouvez contrôler le(s) package(s) pour le(s)quel(s) activer ces assertions. Par défaut, l'activation sera faite pour tous les packages.
Voici un extrait de l'aide en ligne de la JVM : j'ai principalement conserver les lignes en lien avec le principe d'assertion.
$> java Syntaxe : java [-options] class [args...] (pour l'exécution d'une classe) ou java [-options] -jar jarfile [args...] (pour l'exécution d'un fichier JAR) où les options comprennent : ... Listes des options supportées ... -ea[:<packagename>...|:<classname>] -enableassertions[:<packagename>...|:<classname>] activation des assertions avec la granularité spécifiée ... Listes des options supportées ...
L'intérêt de pouvoir activer, ou non, les assertions réside dans le fait de pouvoir réaliser des tests supplémentaires durant les phases de développement de l'application puis de pouvoir les supprimer lors du passage en production.
Phases de développement : on active les assertions afin de s'assurer que tout fonctionne comme prévu en maximisant les vérifications via les assertions. Ce que nous vérifions, ce sont des états attendus : on affirme, via les assertions, qu'on est bien dans l'état attendu.
Phases de production : il n'est plus nécessaire de vérifier les choses dont on est certains. On choisi donc de ne plus activer les assertions et la JVM (plus précisément, le JIT - Just In Time Compiler) ne produira plus le code natif nécessaire à leurs exécutions.
Voici un petit exemple d'utilisation d'assertions :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import java.util.Scanner; public class Demo { public static void main(String[] args) { try ( Scanner scanner = new Scanner(System.in) ) { double temperature; System.out.print("Enter temperature in °Celsius : "); temperature = scanner.nextDouble(); double temperatureFahrenheit = 9*temperature/5 + 32; assert temperatureFahrenheit > -459.67; // Zéro absolue en °Fahrenheit double temperatureKelvin = temperature + 273.15; assert temperatureKelvin > 0; // Zéro absolue en ° Kelvin System.out.printf( "Fahrenheit => %f°F\n", temperatureFahrenheit ); System.out.printf( "Kelvin => %f°K\n", temperatureKelvin ); } } } |
Et voici les résultats produits par cet exemple.
$> java -ea Demo Enter temperature in °Celsius : 20 Fahrenheit => 68,000000°F Kelvin => 293,150000°K $>
Pour terminer cette présentation sur les assertions, notez que vous pouvez spécifier un message d'erreur en cas de violation d'une assertion.
Le message d'erreur, une chaîne de caractères, sera séparé de la condition à vérifier par un caractère :
.
1 |
assert condition : "error message"; |
Voici le même code que précédemment, mais avec des messages d'erreurs un peu plus précis sur ce qui n'a pas été respecté.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import java.util.Scanner; public class Demo { public static void main(String[] args) { try ( Scanner scanner = new Scanner(System.in) ) { double temperature; System.out.print("Enter temperature in °Celsius : "); temperature = scanner.nextDouble(); double temperatureFahrenheit = 9*temperature/5 + 32; assert temperatureFahrenheit > -459.67 : "Temperature lower than absolute zero"; double temperatureKelvin = temperature + 273.15; assert temperatureKelvin > 0 : "Temperature lower than absolute zero"; System.out.printf( "Fahrenheit => %f°F\n", temperatureFahrenheit ); System.out.printf( "Kelvin => %f°K\n", temperatureKelvin ); } } } |
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :