Structures conditionnelles en Java
Prérequis
Maîtriser les opérateurs relationnels (==, !=, >, <…) et logiques (&&, ||, !). Savoir déclarer et initialiser des variables Java.
Objectifs
Comprendre et utiliser les quatre structures conditionnelles Java : if, if-else, if-else if-else et switch. Savoir choisir la structure adaptée selon le contexte.
1. Vue d'ensemble des structures conditionnelles
| Structure | Usage typique | Nombre de branches |
|---|---|---|
if |
Exécuter un bloc seulement si une condition est vraie | 1 |
if-else |
Choisir entre deux alternatives | 2 |
if-else if-else |
Choisir parmi plusieurs conditions mutuellement exclusives | N |
switch |
Tester une variable contre des valeurs constantes | N (avec case) |
2. Structure if
if évalue une condition. Si elle vaut true, le bloc d'instructions est exécuté. Si elle vaut false, le bloc est ignoré et l'exécution continue après le if.
if (condition) {
// instructions exécutées si condition == true
}
Exemple 1 — Tester le signe d'un entier
public class TestIf {
public static void main(String[] args) {
int a = -3;
if (a < 0) {
System.out.println("la valeur de a est négative");
}
System.out.println("Good bye !");
}
}
la valeur de a est négative Good bye !
if ne contient qu'une seule instruction, les accolades {} sont facultatives. Les deux formes suivantes sont équivalentes :
// Avec accolades
if (a < 0) {
System.out.println("négatif");
}
// Sans accolades (une seule instruction)
if (a < 0)
System.out.println("négatif");
Par bonne pratique, conservez toujours les accolades pour éviter des erreurs lors d'ajouts futurs d'instructions.3. Structure if-else
else est exécuté lorsque la condition du if est false. L'un des deux blocs est toujours exécuté — jamais les deux.
if (condition) {
// instructions si condition == true
} else {
// instructions si condition == false
}
Exemple 2 — Positif ou négatif/nul
public class TestIfElse {
public static void main(String[] args) {
int a = 3;
if (a < 0) {
System.out.println("la valeur de a est négative");
} else {
System.out.println("la valeur de a est positive ou nulle");
}
System.out.println("Good bye !");
}
}
la valeur de a est positive ou nulle Good bye !
?: remplace avantageusement un if-else :
// if-else classique
String signe;
if (a < 0) signe = "négative";
else signe = "positive ou nulle";
// Équivalent avec l'opérateur ternaire
String signe = (a < 0) ? "négative" : "positive ou nulle";
System.out.println("Valeur " + signe);
4. Structure if-else if-else
else final est exécuté si aucune condition n'est vraie.
if (condition1) {
// exécuté si condition1 == true
} else if (condition2) {
// exécuté si condition1 == false ET condition2 == true
} else if (condition3) {
// exécuté si condition1, condition2 == false ET condition3 == true
} else {
// exécuté si toutes les conditions sont false
}
Exemple 3 — Signe d'un entier (négatif / positif / nul)
public class TestIfElseIf {
public static void main(String[] args) {
int a = 3;
if (a < 0) {
System.out.println("la valeur de a est négative");
} else if (a > 0) {
System.out.println("la valeur de a est positive");
} else {
System.out.println("la valeur de a est nulle");
}
System.out.println("Good bye !");
}
}
la valeur de a est positive Good bye !
Application — Mention selon une note
int note = 14;
String mention;
if (note >= 16) {
mention = "Très bien";
} else if (note >= 14) {
mention = "Bien";
} else if (note >= 12) {
mention = "Assez bien";
} else if (note >= 10) {
mention = "Passable";
} else {
mention = "Insuffisant";
}
System.out.println("Mention : " + mention);
Mention : Bien
if-else if, l'ordre des conditions est crucial. Tester d'abord note >= 10 avant note >= 14 capturerait toutes les notes à partir de 10 dans le premier bloc, rendant les suivants inatteignables. Commencez toujours par la condition la plus restrictive.5. Structure if imbriquée
if-else à l'intérieur du corps d'une autre instruction if-else. Cela permet de tester des conditions hiérarchiques (une condition dépend d'une autre).Exemple 4 — Imbriquer des conditions
public class TestIfImbrique {
public static void main(String[] args) {
int a = -2;
if (a <= 0) {
// Condition imbriquée à l'intérieur du premier if
if (a == 0) {
System.out.println("la valeur de a est nulle");
} else {
System.out.println("la valeur de a est négative");
}
} else {
System.out.println("la valeur de a est positive");
}
System.out.println("Good bye !");
}
}
la valeur de a est négative Good bye !
else est toujours associé au if le plus proche. Ce comportement peut provoquer des bugs difficiles à détecter :
// Apparence trompeuse : le else semble associé au premier if
if (a > 0)
if (a > 10)
System.out.println("a > 10");
else
System.out.println("a <= 0 ?"); // NON ! associé à "if (a > 10)"
// Solution : toujours utiliser des accolades
if (a > 0) {
if (a > 10) {
System.out.println("a > 10");
}
} else {
System.out.println("a <= 0");
}
6. Structure switch
switch compare une expression à une liste de valeurs constantes (case) et exécute le bloc correspondant. Elle est particulièrement lisible quand on teste une même variable contre de nombreuses valeurs fixes.
switch (expression) {
case valeur1:
// instructions
break;
case valeur2:
// instructions
break;
case valeur3:
// instructions
break;
default:
// instructions si aucun case ne correspond
}
6.1 Règles du switch
- L'expression du
switchdoit être de typebyte,short,char,int,Stringouenum. - Chaque valeur de
casedoit être une constante ou un littéral du même type que l'expression. - Le mot-clé
breakarrête l'exécution duswitch. Sansbreak, l'exécution continue dans lescasesuivants (fall-through). - Le
defaultest exécuté si aucuncasene correspond. Il est facultatif mais recommandé.
Exemple 5 — Afficher le jour de la semaine
public class TestSwitch {
public static void main(String[] args) {
int jour = 3;
switch (jour) {
case 1:
System.out.println("Lundi");
break;
case 2:
System.out.println("Mardi");
break;
case 3:
System.out.println("Mercredi");
break;
case 4:
System.out.println("Jeudi");
break;
case 5:
System.out.println("Vendredi");
break;
case 6:
System.out.println("Samedi");
break;
case 7:
System.out.println("Dimanche");
break;
default:
System.out.println("Jour invalide (entre 1 et 7)");
}
}
}
Mercredi
6.2 Le fall-through — regrouper des cases
L'absence de break permet d'exécuter plusieurs case consécutifs. Cette technique est utile pour regrouper des valeurs partageant le même comportement.
Exemple 6 — Jour ouvré ou week-end
int jour = 6;
switch (jour) {
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.println("Jour ouvré");
break;
case 6:
case 7:
System.out.println("Week-end");
break;
default:
System.out.println("Jour invalide");
}
Week-end
6.3 Switch avec String (Java 7+)
String saison = "Hiver";
switch (saison) {
case "Printemps":
case "Été":
System.out.println("Saison chaude");
break;
case "Automne":
case "Hiver":
System.out.println("Saison froide");
break;
default:
System.out.println("Saison inconnue");
}
Saison froide
6.4 Switch expression (Java 14+)
Complément — Nouvelle syntaxe switch expression
Depuis Java 14, le switch peut être utilisé comme une expression (retourne une valeur). La flèche -> remplace les case: et break, rendant le code plus concis et sûr (pas de fall-through accidentel).
int jour = 3;
// Switch expression — retourne directement une valeur
String nomJour = switch (jour) {
case 1 -> "Lundi";
case 2 -> "Mardi";
case 3 -> "Mercredi";
case 4 -> "Jeudi";
case 5 -> "Vendredi";
case 6 -> "Samedi";
case 7 -> "Dimanche";
default -> "Jour invalide";
};
System.out.println(nomJour);
Mercredi
6.5 Comparaison if-else if vs switch
| Critère | if-else if |
switch |
|---|---|---|
| Type de condition | Toute expression booléenne | Valeur constante uniquement |
| Types supportés | Tous types | int, char, String, enum |
| Lisibilité (nombreux cas) | Moins lisible | Plus lisible |
| Plages de valeurs | Possible (a >= 10 && a < 20) |
Non supporté (valeurs exactes) |
| Performance (nombreux cas) | Linéaire | Potentiellement en O(1) (table de saut) |
7. Exercice
Calculatrice simple avec switch
Écrire un programme Java nommé Calculatrice qui prend deux entiers a et b et un opérateur (char), puis affiche le résultat de l'opération correspondante.
Travail demandé
- Utiliser un
switchsur l'opérateur ('+','-','*','/','%'). - Afficher le résultat sous la forme
10 / 3 = 3. - Gérer la division par zéro avec un message d'erreur.
- Afficher
"Opérateur inconnu"dans ledefault.
a=10, b=3, op='/'
10 / 3 = 3
a=10, b=0, op='/'
Erreur : division par zéro !
- Utiliser
switchpour sélectionner l'opération - Utiliser
ifà l'intérieur ducase '/'pour gérer la division par zéro - Le
defaultdoit afficher un message d'opérateur inconnu
public class Calculatrice {
public static void main(String[] args) {
int a = 10;
int b = 3;
char op = '/';
switch (op) {
case '+':
System.out.println(a + " + " + b + " = " + (a + b));
break;
case '-':
System.out.println(a + " - " + b + " = " + (a - b));
break;
case '*':
System.out.println(a + " * " + b + " = " + (a * b));
break;
case '/':
if (b == 0) {
System.out.println("Erreur : division par zéro !");
} else {
System.out.println(a + " / " + b + " = " + (a / b));
}
break;
case '%':
if (b == 0) {
System.out.println("Erreur : modulo par zéro !");
} else {
System.out.println(a + " % " + b + " = " + (a % b));
}
break;
default:
System.out.println("Opérateur inconnu : " + op);
}
}
}
public class CalculatriceModerne {
public static void main(String[] args) {
int a = 10;
int b = 3;
char op = '/';
String resultat = switch (op) {
case '+' -> a + " + " + b + " = " + (a + b);
case '-' -> a + " - " + b + " = " + (a - b);
case '*' -> a + " * " + b + " = " + (a * b);
case '/' -> (b == 0)
? "Erreur : division par zéro !"
: a + " / " + b + " = " + (a / b);
case '%' -> (b == 0)
? "Erreur : modulo par zéro !"
: a + " % " + b + " = " + (a % b);
default -> "Opérateur inconnu : " + op;
};
System.out.println(resultat);
}
}
10 / 3 = 3
- switch sur char : les valeurs de
casesont des littéraux de caractères entre guillemets simples ('+','-'…). - if imbriqué dans switch : la vérification
b == 0illustre l'imbrication d'unifdans uncase. - break obligatoire : sans
break, l'exécution continuerait dans lescasesuivants (fall-through). - Switch expression (Java 14+) : la flèche
->élimine le risque de fall-through et rend le code plus concis.
L'essentiel en bref
Java propose quatre structures conditionnelles. Le if exécute un bloc si une condition est vraie. Le if-else choisit entre deux alternatives. Le if-else if-else teste plusieurs conditions en cascade — l'ordre est crucial, partez toujours de la condition la plus restrictive. Le switch compare une expression à des valeurs constantes et est préférable au if-else if quand on teste une même variable contre de nombreuses valeurs fixes. Depuis Java 14, le switch expression avec la flèche -> élimine le fall-through accidentel et permet de retourner directement une valeur.
Discussion (0)
Soyez le premier à laisser un commentaire !
Laisser un commentaire
Votre commentaire sera visible après modération.