← Java SE 21 — préparation OCP

Module 1 / 8 · 90 min

Valeurs, promotions, texte et contrôle de flux

Séparer types de compilation, valeurs et chemins exécutés.

Votre progression apparaîtra ici lorsque JavaScript est actif.

La progression et le meilleur score sont enregistrés uniquement dans ce navigateur. Aucun compte n’est nécessaire ; effacer les données du navigateur les supprime. Les durées de modules sont indicatives et incluent les exercices.

Comprendre le mécanisme

Java détermine les types à la compilation. var infère un type local ; il ne rend pas la variable dynamiquement typée. Les opérations sur byte et short peuvent promouvoir les opérandes en int. Un cast explicite peut perdre de l’information. Pour des objets, == compare généralement les références ; equals porte le contrat d’égalité de la classe. String est immuable alors que StringBuilder accumule des modifications.

Raisonner et vérifier

Tracez séparément la sélection d’une branche et la valeur calculée. Un switch expression doit fournir un résultat sur chaque chemin possible ; yield fournit la valeur d’un bloc. Un wrapper null peut provoquer une NullPointerException à l’unboxing. Les tests doivent inclure bornes numériques, chaîne vide, null et chemin par défaut, pas seulement un exemple nominal.

Deux familles de valeurs

Les primitifs représentent directement des valeurs comme un entier ou un booléen ; les références désignent des objets ou null. Un Integer et un int ne se comportent donc pas identiquement face à l’absence. Avant une opération, repérez la famille de chaque opérande et les conversions possibles. Cette lecture évite d’attribuer à une valeur nullable les garanties d’un primitif simplement parce que leurs noms se ressemblent.

Erreur fréquente à comprendre

Tout int est une référence nullable.

Un primitif ne peut pas porter null.

Inférer sans rendre dynamique

var laisse le compilateur déterminer le type d’une variable locale à partir de son initialisation. Une fois établi, ce type ne change pas à chaque affectation. Si le résultat initial est un entier, lui affecter ensuite une chaîne ne devient pas valide grâce au mot-clé. Utilisez l’inférence lorsque le type demeure lisible et vérifiez séparément le type de l’expression initiale, notamment après une promotion numérique.

Erreur fréquente à comprendre

var rend toute variable dynamiquement retypable.

Le type inféré reste un type statique.

Affecter avant de consulter

Une variable locale doit être définitivement assignée sur le chemin où elle est lue. Les valeurs initiales prévues pour certains champs ne doivent pas être généralisées aux locales. Tracez les branches : si une condition laisse la variable sans affectation, la lecture n’a pas de contrat sûr. Ajouter un zéro arbitraire peut faire compiler le code mais masquer l’absence d’une décision métier nécessaire.

Erreur fréquente à comprendre

Toute locale reçoit automatiquement zéro.

Les règles d’initialisation locale imposent une affectation.

Le déballage exige une valeur présente

Une opération sur un wrapper peut demander son unboxing vers un primitif. Si la référence vaut null, cette conversion peut lancer une NullPointerException avant le calcul attendu. Définissez si l’absence est une erreur ou un état normal, puis placez une garde adaptée. Un test avec une référence non nulle ne couvre pas ce chemin, même si toutes les valeurs numériques nominales ont été essayées.

Erreur fréquente à comprendre

Déballer null produit toujours zéro.

La conversion nécessite une valeur emballée non nulle.

Promotion et division entière

Les opérations sur des types numériques étroits peuvent promouvoir les opérandes, par exemple byte plus byte vers int. Avec deux int, une division entière ne conserve pas la fraction : cinq divisé par deux produit deux. var infère le type de ce résultat, sans changer l’opération réalisée. Pour une division décimale, choisissez explicitement une représentation compatible avec la précision attendue et vérifiez les règles d’arrondi utiles.

Erreur fréquente à comprendre

5 divisé par 2 en int produit 2,5.

Le résultat entier ne conserve pas la fraction.

Conversions et perte de précision

Un cast peut réduire une plage ou une précision ; il ne prouve pas que la valeur initiale était admissible. Avant de convertir une donnée d’API, vérifiez son format et les bornes du type cible. Pour un identifiant qui doit garder tous ses chiffres sans calcul, une représentation textuelle peut être plus appropriée qu’un nombre approximatif. La conversion doit être une étape du contrat, pas une réparation aveugle d’entrée invalide.

Erreur fréquente à comprendre

Tout cast numérique préserve exactement toute valeur.

Les plages et précisions diffèrent.

Identité, contenu et texte mutable

Pour des références, == répond à une question d’identité, tandis que equals applique le contrat de la classe. Deux chaînes de même contenu ne doivent pas être comparées par une hypothèse générale sur leur partage en mémoire. String est immuable ; StringBuilder offre des opérations de modification de son contenu. Distinguez donc égalité de texte, identité d’objet et mutabilité avant de déduire ce qu’une affectation ou concaténation préserve.

Erreur fréquente à comprendre

Deux String de même contenu sont toujours la même référence.

L’identité d’objet et la valeur ne sont pas équivalentes.

Suivre tous les chemins du switch

Un switch doit respecter le type du sélecteur et les règles des cas de la version ciblée. Une expression switch doit fournir une valeur selon son contrat ; un bloc de branche peut utiliser yield pour la produire. Listez les états attendus et la politique pour une entrée inconnue ou null. Le nom d’un état reçu du réseau n’est pas encore une valeur validée de votre modèle.

Erreur fréquente à comprendre

Tout switch accepte toute valeur sans règles de compatibilité.

Le langage vérifie le contrat du sélecteur et des branches.

Le type ne définit pas le domaine

Un int représente une plage de valeurs machine, pas une quantité positive ou un âge autorisé. Après reconnaissance du type et conversion contrôlée, appliquez les bornes et relations du domaine. Un zéro peut être une valeur métier distincte d’une absence. Les tests doivent donc séparer ces catégories, puis vérifier que chaque refus intervient avant une mutation ou un appel externe.

Erreur fréquente à comprendre

Un entier représente nécessairement un âge autorisé.

La plage métier doit être validée.

Respecter l’ordre et les effets

Une expression peut consulter et modifier plusieurs états. La réordonner pour la rendre plus compacte peut changer les valeurs observées, même si les opérateurs semblent arithmétiques. Décomposez les étapes lorsque des effets se combinent et notez l’état après chaque affectation. Cette méthode sert aussi à analyser un QCM : distinguez l’ordre d’évaluation, le type obtenu et la valeur calculée au lieu de deviner à partir de l’affichage.

Erreur fréquente à comprendre

Toute expression Java est librement réordonnable sans conséquence.

L’ordre d’évaluation et les effets doivent être respectés.

Atelier guidé : lire, expliquer et vérifier le code

class Main {
    public static void main(String[] args) {
        var result = 5 / 2;
        System.out.print(result);
    }
}

Le compilateur voit deux littéraux entiers dans la division. L’opération produit donc un entier dont la partie fractionnaire est écartée selon les règles de division entière. La variable déclarée avec var reçoit ce type inféré et le programme affiche 2. L’inférence ne transforme pas rétrospectivement la division en calcul flottant.

Modifiez un opérande pour obtenir une division avec un type décimal, puis comparez le type et l’affichage. Reprenez ensuite l’addition de deux byte et vérifiez que le type de l’expression est int. Enfin, essayez une réaffectation textuelle à result dans un fichier de laboratoire : le refus de compilation démontre que var n’est pas un mécanisme de typage dynamique.

Exemple commenté

byte a = 10;
byte b = 20;
int total = a + b;
var label = "total=" + total;
System.out.println(label);

L’addition produit un int, puis la concaténation construit une chaîne. L’inférence de label n’autorise pas une réaffectation ultérieure à un nombre.

Exercice de mise en pratique

Écrivez un switch expression qui transforme trois états de réservation en libellés et traite explicitement une entrée inconnue.

Voir une proposition de correction

Utilisez un enum et un switch exhaustif. Comparez avec une entrée texte validée avant conversion. Ajoutez des tests pour chaque branche et pour null selon le contrat choisi.

Points de vérification

  • Repérer promotion et unboxing.
  • Distinguer identité et égalité.
  • Analyser tous les chemins du switch.

Contrôle de connaissances

Cours associé : Valeurs, promotions, texte et contrôle de flux ↗
Quel est le type de a + b lorsque a et b sont byte ?

Documentation de référence ↗

Validation du module

101 questions, objectif pédagogique de 75 %. Durée conseillée de 150 minutes, sans limite imposée. Les questions et les choix sont mélangés ; le corrigé apparaît après validation. Le contrôle rapide de la leçon et l’examen final du cours restent des exercices distincts.

Commencer ou reprendre les 101 questions →