Rechercher
 

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 :

Utilisation d'assertions

Les instructions break et continue Définition de méthodes statiques en Java



Accès rapide :
   La vidéo

La vidéo

Cette vidéo vous montre comment utiliser les assertions en Java.


Utilisation d'assertions

Qu'est ce qu'une assertion ?

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] ); 
    
    }
    
}
Exemple d'utilisation d'une assertion
une assertion n'est pas une fonction. Les parenthèses, autour de l'expression, ne sont donc pas nécessaire. Vous pouvez les mettre et donc parenthéser l'expression spécifiée, mais elles ne serviront à rien !
par défaut, les assertions ne sont pas activées. Donc si vous lancez l'application, sans activer les assertions, aucune erreur ne sera produite en cas de violation d'assertion.
$> 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 ? »

Activation des 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.

s'il s'agit de vérifier des données saisies par l'utilisateur, on ne pourra pas être certains de la cohérence de la donnée, même en production : dans ce cas, n'utilisez pas d'assertions (qui pourraient être coupées en production) et préférez des tests traditionnels et des remontées d'exceptions (contrairement au premier exemple montré en haut de ce document : c'etait juste pour valider la non activation des assertions).

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 );
        }
    }
}
Conversions de températures.

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
$>

Spécifier un message d'erreur pour votre assertion

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";
Un assert avec un message d'erreur

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 );
        }
    }
}
Conversions de températures.


Les instructions break et continue Définition de méthodes statiques en Java