Prendre des décisions avec if
Les programmes doivent réagir aux données : réussi ou échoué, en stock ou épuisé, valide ou non. L'instruction if est la façon dont Java choisit quel code exécuter selon une condition.
Un if prend une condition booléenne entre parenthèses et exécute le bloc entre accolades uniquement lorsque cette condition est true :
La condition score >= 60 est true, donc le message s'affiche. La ligne après l'accolade fermante s'exécute toujours : elle est en dehors du if. Change score en 40 et la ligne « passed » est entièrement ignorée.
Contrairement à C, Java ne te laisse pas mettre un nombre là où un booléen est attendu. if (score) est une erreur de compilation : la condition doit être une vraie expression boolean construite à partir de comparaisons (>, >=, ==, !=) ou de logique booléenne (&&, ||, !).
Ajouter un else
else te donne le chemin « sinon » : du code qui s'exécute uniquement lorsque la condition est false :
Exactement l'un des deux blocs s'exécute : jamais les deux, jamais aucun. Le else n'a pas de condition propre ; il attrape simplement tout ce que le if n'a pas pris.
Enchaîner avec else if
Quand il y a plus de deux issues, enchaîne les conditions avec else if. Java les vérifie de haut en bas et exécute le premier bloc dont la condition est vraie, puis ignore le reste :
L'ordre compte. Comme 84 est d'abord comparé à >= 90 (faux), puis à >= 80 (vrai), il s'arrête à B et ne teste même jamais les bornes inférieures. C'est aussi pourquoi tu n'as pas besoin d'écrire score >= 80 && score < 90 : atteindre la deuxième branche garantit déjà que score était inférieur à 90. Place ta condition la plus restrictive ou la plus prioritaire en premier.
Le else final est ton cas par défaut. L'omettre ici serait une erreur de compilation, car grade pourrait ne pas être affecté au moment de l'afficher.
Comparer des valeurs : == face à equals()
L'erreur de if la plus courante en Java est de comparer des chaînes avec ==. Pour les primitifs (int, double, char, boolean), == est correct. Pour les objets, == demande « est-ce le même objet en mémoire ? » alors que .equals() demande « ont-ils le même contenu ? » — et c'est presque toujours ce dernier que tu veux :
Seul le deuxième message s'affiche. Le new String("yes") est un objet différent du littéral "yes", donc == est false, mais le texte est identique, donc .equals() est true. Règle empirique : les primitifs utilisent ==, les objets utilisent .equals().
Une astuce sûre pour éviter une NullPointerException quand la variable peut être null : place le littéral en premier, if ("yes".equals(input)), puisqu'un littéral n'est jamais null.
Combiner et imbriquer les conditions
Tu peux combiner des conditions avec && (et), || (ou) et ! (non), ou imbriquer un if dans un autre quand une vérification n'a de sens qu'après le succès d'une précédente :
&& et || court-circuitent : dans a && b, si a est faux Java n'évalue jamais b. C'est pratique pour se prémunir des erreurs : if (s != null && s.length() > 0) est sûr car la vérification de longueur est ignorée quand s est null. Préfère combiner avec && plutôt qu'imbriquer en profondeur quand tu le peux ; le code plat se lit plus clairement qu'une pyramide d'accolades.
Un piège classique : un seul = est une affectation, == est une comparaison. Écrire if (x = 5) est une erreur de compilation pour un int (tant mieux), mais if (flag = true) sur un boolean compile et affecte silencieusement : fais-y attention.
L'opérateur ternaire
Quand tout ce que tu veux est de choisir entre deux valeurs, l'opérateur ternaire ?: est une ligne unique compacte. Lis condition ? a : b comme « si condition alors a sinon b » :
Le ternaire produit une valeur que tu peux affecter ou passer directement. Réserve-le à une sélection simple : si l'une des branches a besoin de plusieurs instructions ou de vraie logique, un if-else complet reste lisible là où un ternaire imbriqué devient vite un casse-tête.
Un piège : les accolades facultatives
Java te laisse omettre les accolades quand une branche contient une seule instruction, mais cela invite un bug subtil. L'indentation ment :
if (loggedIn)
System.out.println("Welcome");
System.out.println("Loading dashboard"); // NOT part of the if!
Seule la première ligne est contrôlée par le if ; la seconde s'exécute toujours quoi qu'il arrive, malgré ce que suggère l'indentation. Utilise toujours des accolades, même pour une seule ligne, et toute cette catégorie d'erreurs disparaît.
Ensuite : switch
Les chaînes if-else if sont parfaites quand chaque branche teste une condition différente. Mais quand tu compares une seule valeur à de nombreuses possibilités fixes (un nom de jour, un choix de menu, une enum), une longue échelle de else if devient répétitive. L'instruction switch est faite exactement pour ça, et c'est la page suivante.
Questions fréquentes
Comment écrit-on une instruction if-else en Java ?
Place une condition booléenne entre parenthèses après if, puis le code à exécuter entre accolades, et un bloc else facultatif pour le cas où la condition est fausse : if (score >= 60) { System.out.println("Pass"); } else { System.out.println("Fail"); }. La condition doit s'évaluer en boolean : Java n'accepte pas un int comme le fait C.
Quelle est la différence entre == et equals() dans une instruction if en Java ?
== vérifie si deux références pointent vers le même objet, tandis que .equals() compare le contenu. Pour les types primitifs comme int, utilise ==. Pour les objets, surtout String, utilise .equals() : if (name.equals("Sam")), et non if (name == "Sam"). Utiliser == sur des chaînes est l'erreur de if la plus courante en Java.
Qu'est-ce que l'opérateur ternaire en Java ?
L'opérateur ternaire condition ? valueIfTrue : valueIfFalse est un if-else compact qui produit une valeur. Par exemple, String label = age >= 18 ? "adult" : "minor"; affecte l'une des deux valeurs selon la condition. Utilise-le pour une sélection de valeur simple ; recours à un if-else complet quand il y a de la logique à exécuter dans chaque branche.