📘 Le cours : décider en Java
Un programme choisit entre plusieurs chemins grâce aux conditions. Les mots-clés sont les mêmes qu'en C (if, else, switch), mais Java est plus strict : une condition doit toujours être une expression de type boolean.
Une condition est un boolean
if (n) avec un int ne compile pas : il faut écrire if (n != 0). Les comparaisons produisent un boolean que l'on peut ranger dans une variable, combiner ou afficher.
public class Booleens {
public static void main(String[] args) {
int age = 17;
boolean majeur = age >= 18;
System.out.println(majeur);
System.out.println(age >= 16 && age < 18);
System.out.println(!majeur);
}
}
Les opérateurs
| Opérateur | Sens | Exemple |
== != | égal, différent (nombres, caractères, booléens) | a == b |
< <= > >= | comparaisons de nombres | note >= 10 |
&& | ET logique (s'arrête dès qu'un côté est faux) | a > 0 && a < 10 |
|| | OU logique (s'arrête dès qu'un côté est vrai) | c == 'o' || c == 'O' |
! | NON logique | !estVide |
! passe avant &&, qui passe avant ||. Ajoute des parenthèses dès que l'expression devient longue.
if, else if, else
Les tests sont évalués dans l'ordre et le premier qui est vrai l'emporte. Mets les accolades même pour une seule instruction.
public class Mention {
public static void main(String[] args) {
int note = 14;
if (note >= 16) {
System.out.println("Tres bien");
} else if (note >= 12) {
System.out.println("Bien");
} else if (note >= 10) {
System.out.println("Passable");
} else {
System.out.println("Insuffisant");
}
}
}
ET, OU et évaluation paresseuse
Avec &&, si le côté gauche est faux, le côté droit n'est jamais évalué. On s'en sert pour se protéger : tester qu'un objet existe avant d'appeler une de ses méthodes.
public class Garde {
public static void main(String[] args) {
String texte = null;
if (texte != null && texte.length() > 3) {
System.out.println("texte long");
} else {
System.out.println("texte absent ou court");
}
}
}
Affichagetexte absent ou court
Inverser les deux côtés (texte.length() > 3 && texte != null) provoquerait une NullPointerException, car length() serait appelé sur null.
Comparer des String : equals, pas ==
Pour les nombres, == compare les valeurs. Pour les objets (dont les String), == compare si ce sont le même objet en mémoire, pas s'ils contiennent le même texte. Utilise toujours equals.
public class Comparaison {
public static void main(String[] args) {
String a = "NSI";
String b = new String("NSI");
System.out.println(a == b); // deux objets différents
System.out.println(a.equals(b)); // même texte
}
}
Piège : "NSI" == "NSI" vaut true, car Java réutilise les littéraux identiques. Le bug n'apparaît que lorsque la chaîne vient d'ailleurs (saisie, new String, lecture d'un fichier) : écris equals partout.
switch classique
switch compare une valeur à plusieurs constantes. Sans break, l'exécution continue dans le cas suivant (la « chute ») : c'est ce qui permet de regrouper samedi et dimanche dans l'exemple de la deuxième carte. default prend tous les autres cas.
switch fléché (Java 14 et plus)
La forme -> n'a pas de chute et peut renvoyer une valeur : elle est plus sûre et plus courte.
public class Saison {
public static void main(String[] args) {
int mois = 2;
String saison = switch (mois) {
case 12, 1, 2 -> "hiver";
case 6, 7, 8 -> "ete";
default -> "entre-saison";
};
System.out.println(saison);
}
}
L'opérateur ternaire
condition ? siVrai : siFaux est une expression ; réserve-la aux choix simples.
public class Ternaire {
public static void main(String[] args) {
int a = 4, b = 9;
int max = (a > b) ? a : b;
String parite = (a % 2 == 0) ? "pair" : "impair";
System.out.println("max = " + max);
System.out.println(a + " est " + parite);
}
}
Affichagemax = 9
4 est pair