1. Introduction
Imaginez que vous écrivez un programme pour un café. L’utilisateur peut choisir une boisson, et vous devez réagir à ce choix. On peut bien sûr enchaîner des if-else if-else, mais ce n’est pas très élégant :
if (choice == 1)
{
System.out.println("Vous avez choisi un espresso.");
}
else if (choice == 2)
{
System.out.println("Vous avez choisi un cappuccino.");
}
else if (choice == 3)
{
System.out.println("Vous avez choisi un latte.");
}
else
{
System.out.println("Cette boisson n’existe pas.");
}
Avouez que c’est lourd. Et s’il y a 10 ou 20 variantes ? C’est là que l’instruction switch vient à la rescousse : elle permet d’implémenter de façon élégante et compacte un choix parmi de nombreuses options selon la valeur d’une variable.
Syntaxe du switch classique
La syntaxe de switch en Java ressemble à ceci :
switch (expression)
{
case value1:
// actions si expression == value1
break;
case value2:
// actions si expression == value2
break;
...
default:
// actions si aucune correspondance avec un case
break;
}
switch en Java
Éléments clés :
- switch (expression) — l’expression dont le résultat est comparé à chaque case.
- case valeur: — une option à comparer avec l’expression.
- break; — met fin à l’exécution du bloc switch (sinon — « fall-through » vers le case suivant).
- default: — s’exécute s’il n’y a aucune correspondance avec un case.
2. Exemples d’utilisation de switch
Exemple 1 : classique du genre — choix de boisson
Implémentons un menu pour un café :
import java.util.Scanner;
public class CoffeeShop
{
public static void main(String[] args)
{
Scanner console = new Scanner(System.in);
System.out.println("Choisissez une boisson:");
System.out.println("1 - Espresso");
System.out.println("2 - Cappuccino");
System.out.println("3 - Latte");
int choice = console.nextInt();
switch (choice)
{
case 1:
System.out.println("Vous avez choisi un espresso.");
break;
case 2:
System.out.println("Vous avez choisi un cappuccino.");
break;
case 3:
System.out.println("Vous avez choisi un latte.");
break;
default:
System.out.println("Cette boisson n’existe pas.");
break;
}
}
}
Ce qui se passe :
- L’utilisateur saisit le numéro de la boisson.
- La valeur de la variable choice est comparée à chaque case.
- En cas de correspondance — le bloc correspondant s’exécute, puis break met fin à switch.
- Si aucune correspondance — default s’exécute.
Exemple 2 : switch sur des chaînes
On ne peut pas utiliser beaucoup de types dans switch, mais les chaînes — oui ! C’est pratique pour des menus de commandes :
import java.util.Scanner;
public class CommandMenu
{
public static void main(String[] args)
{
Scanner console = new Scanner(System.in);
System.out.println("Saisissez une commande (start, stop, pause):");
String command = console.nextLine();
switch (command)
{
case "start":
System.out.println("Démarrage du programme!");
break;
case "stop":
System.out.println("Arrêt du programme.");
break;
case "pause":
System.out.println("Pause.");
break;
default:
System.out.println("Commande inconnue.");
break;
}
}
}
À noter : la comparaison de chaînes dans switch est sensible à la casse ! "Start" et "start" sont des chaînes différentes.
3. Quels types le switch classique prend-il en charge ?
Dans le switch classique, seuls certains types sont autorisés :
- Types entiers primitifs : byte, short, char, int
- Énumérations : enum (nous en parlerons au prochain cours)
- Chaînes : String — comparaison sensible à la casse
Interdit d’utiliser : boolean, float, double, les tableaux, les objets arbitraires (sauf enum et String).
Exemple avec char
char grade = 'B';
switch (grade)
{
case 'A':
System.out.println("Excellent!");
break;
case 'B':
System.out.println("Bien.");
break;
case 'C':
System.out.println("Satisfaisant.");
break;
default:
System.out.println("Essayez encore.");
break;
}
4. Break obligatoire : que se passe-t-il si on l’oublie ?
L’erreur la plus fréquente des débutants — oublier break;. Voyons ce qui se passe :
int day = 2;
switch (day)
{
case 1:
System.out.println("Lundi");
break;
case 2:
System.out.println("Mardi");
case 3:
System.out.println("Mercredi");
break;
default:
System.out.println("Jour inconnu");
break;
}
Résultat :
Mardi
Mercredi
Pourquoi ? Parce qu’après case 2 il n’y a pas de break, et l’exécution « tombe » dans le case suivant (c’est ce qu’on appelle le fall-through). Parfois c’est utile, mais le plus souvent — une erreur.
5. Regroupement des case : quand plusieurs valeurs ont le même comportement
Si plusieurs valeurs doivent avoir le même comportement, on peut les écrire à la suite :
int month = 1;
switch (month)
{
case 12:
case 1:
case 2:
System.out.println("Hiver");
break;
case 3:
case 4:
case 5:
System.out.println("Printemps");
break;
case 6:
case 7:
case 8:
System.out.println("Été");
break;
case 9:
case 10:
case 11:
System.out.println("Automne");
break;
default:
System.out.println("Mois inconnu");
break;
}
Ici : si month vaut 12, 1 ou 2, le programme affichera "Hiver".
6. Comparaison : switch et if-else
| Scénario | if-else | switch |
|---|---|---|
| Beaucoup d’options | Chaîne longue, moins lisible | Court, toutes les options sont visibles d’un coup d’œil |
| Comparaison d’intervalles | Possible (if (x > 5 && x < 10)) | Impossible, uniquement des valeurs exactes |
| Types pris en charge | Tous | Uniquement certains (voir ci-dessus) |
| Piège lié à break | Non | Oui, il faut impérativement veiller aux break |
7. Erreurs courantes avec switch
Erreur n° 1 : oubli de break
La cause la plus fréquente des bugs : vous avez oublié break — et le code exécute un case inattendu.
Erreur n° 2 : type non pris en charge
Vous essayez d’utiliser double, float ou boolean — le compilateur dira « interdit ».
Erreur n° 3 : chaînes avec casse différente
L’utilisateur saisit "Start", et vous attendez "start" — switch ne correspondra pas. Mieux vaut normaliser la casse des chaînes en amont :
switch (command.toLowerCase())
{
case "start":
// ...
}
Erreur n° 4 : une variable dans un case au lieu d’une constante
Seules des constantes sont autorisées dans un case. Si vous utilisez une variable — il y aura une erreur de compilation.
Erreur n° 5 : case en double
Deux valeurs de case identiques — le compilateur ne vous le pardonnera pas.
GO TO FULL VERSION