Note #4 — Java
Gestion des Exceptions
try-catch-finally, exceptions personnalisées, bonnes pratiques
1. Hiérarchie
Throwable
/ \
Error Exception
(JVM grave) / \
RuntimeException IOException (Checked)
(Unchecked) SQLException (Checked)
NullPointerException
ArrayIndexOutOfBoundsException
ArithmeticException
• Error : problèmes graves de la JVM — ne pas attraper
• Checked : doivent être déclarées (throws) ou traitées (try-catch)
• Unchecked / RuntimeException : erreurs de programmation, non obligatoires à déclarer
2. try-catch-finally
try {
int[] tab = new int[3];
tab[5] = 10; // ArrayIndexOutOfBoundsException
int r = 10 / 0; // ArithmeticException
} catch (ArrayIndexOutOfBoundsException e) {
[Link]("Indice invalide : " + [Link]());
} catch (ArithmeticException e) {
[Link]("Division par zéro !");
} catch (Exception e) { // filet de sécurité
[Link]();
} finally {
[Link]("Toujours exécuté — nettoyage.");
}
■ Le bloc finally s'exécute même en cas de return ou d'exception non attrapée.
3. try-with-resources (Java 7+)
Les objets implémentant AutoCloseable sont automatiquement fermés à la fin du bloc.
try (BufferedReader br = new BufferedReader(new FileReader("[Link]"))) {
String ligne;
while ((ligne = [Link]()) != null) {
[Link](ligne);
}
} catch (IOException e) {
[Link]("Erreur : " + [Link]());
}
// [Link]() appelé automatiquement
4. throw & throws
public class Banque {
private double solde;
public void retirer(double montant) throws IllegalArgumentException {
if (montant <= 0)
throw new IllegalArgumentException("Montant doit être positif");
if (montant > solde)
throw new IllegalStateException("Solde insuffisant");
solde -= montant;
}
}
5. Exceptions personnalisées
// Exception métier checked
public class SoldeInsuffisantException extends Exception {
private final double manque;
public SoldeInsuffisantException(double manque) {
super("Solde insuffisant. Manque : " + manque + " EUR");
[Link] = manque;
}
public double getManque() { return manque; }
}
// Utilisation
try {
[Link](500);
} catch (SoldeInsuffisantException e) {
[Link]([Link]());
[Link]("Manque : " + [Link]() + " EUR");
}
6. Bonnes pratiques
• N'attrapez que les exceptions que vous pouvez gérer réellement.
• Ne laissez jamais un catch vide — loggez au minimum l'erreur.
• Préférez les exceptions spécifiques aux génériques (Exception).
• Créez des exceptions métier pour les erreurs fonctionnelles.
• Évitez les exceptions pour contrôler le flux normal d'exécution.
• Documentez avec @throws dans les Javadoc.