17.7 Gestion des exceptions et hiérarchie des exceptions en Java
La gestion des exceptions est un aspect fondamental de la programmation Java, car elle permet à un programme de réagir de manière appropriée aux conditions inattendues lors de l'exécution. Les exceptions en Java sont des objets qui représentent des situations anormales pouvant survenir lors de l'exécution d'un programme. En comprenant la hiérarchie des exceptions et en apprenant à les gérer correctement, les programmeurs peuvent créer des applications plus robustes et plus fiables.
Hiérarchie des exceptions en Java
En Java, toutes les exceptions sont des descendantes de la classe Throwable
. Cette classe est divisée en deux sous-classes principales : Error
et Exception
. La classe Error
est utilisée pour les situations d'erreur graves que l'application ne devrait normalement pas tenter de gérer, telles que les problèmes de machine virtuelle Java (JVM). La classe Exception
est celle qui nous intéresse pour gérer les exceptions, car elle inclut toutes les exceptions qu'une application peut vouloir gérer.
Les exceptions de la classe Exception
sont divisées en deux catégories : les exceptions vérifiées et les exceptions non vérifiées. Les exceptions vérifiées sont celles dont le compilateur exige qu'elles soient gérées ou déclarées dans la signature de la méthode. Les exemples incluent IOException
et SQLException
. Ceux qui ne sont pas cochés, une sous-classe de RuntimeException
, n'ont pas besoin d'être explicitement traités ou déclarés. Des exemples courants sont NullPointerException
et IndexOutOfBoundsException
.
Méthodes et clause throws
Lorsqu'une méthode peut lever une exception qu'elle ne gère pas, elle doit déclarer cette possibilité en utilisant la clause throws
dans sa signature. Ceci est obligatoire pour les exceptions vérifiées, mais facultatif pour les exceptions non vérifiées. La clause throws
informe l'appelant de la méthode qu'il doit être prêt à gérer cette exception ou, alternativement, à la propager.
public void myMethod() lance IOException {
// Code pouvant lever une IOException
}
Si la méthode myMethod
ci-dessus renvoie une IOException
, elle n'a pas besoin de gérer cette exception en interne ; au lieu de cela, il le propage à la méthode qui l'a appelé. Cette méthode appelante doit alors gérer l'exception ou également la déclarer dans sa signature avec la clause throws
.
Gestion des exceptions avec try-catch
Pour gérer les exceptions, nous utilisons les blocs try
et catch
. Le bloc try
contient le code qui peut lever une exception, tandis que le bloc catch
contient le code qui est exécuté si une exception se produit. Nous pouvons avoir plusieurs blocs catch
pour gérer différents types d'exceptions.
essayer {
// Code pouvant lever des exceptions
} catch (IOException e) {
// Code pour gérer IOException
} catch (SQLException e) {
// Code pour gérer SQLException
}
Il est important de noter que les blocs catch
doivent suivre l'ordre de spécificité, du plus spécifique au plus générique, car une fois qu'une exception est interceptée par un bloc catch
, les blocs suivants ne sont pas évalués.
clause finale
Il existe également la clause finally
, qui est facultative et suit les blocs try-catch
. Le code à l'intérieur du bloc finally
s'exécute indépendamment du fait qu'une exception soit levée ou non, ce qui le rend utile pour exécuter du code de maintenance tel que la fermeture de connexions ou la libération de ressources.
essayer {
// Code pouvant lever des exceptions
} attraper (Exception e) {
// Code pour gérer les exceptions
} enfin {
// Code toujours exécuté après try ou catch
}
Propagation des exceptions
Parfois, il peut être souhaitable ou nécessaire de propager une exception afin qu'elle puisse être gérée ailleurs. Cela se fait simplement en n'interceptant pas l'exception dans un bloc catch
ou en la lançant à nouveau dans un bloc catch
à l'aide du mot-clé throw
.
public void myMethod() lance IOException {
essayer {
// Code pouvant lever une IOException
} catch (IOException e) {
// Vous pouvez faire quelque chose avec l'exception et le relancer
lancez e;
}
}
Exceptions personnalisées
Les développeurs peuvent également créer leurs propres exceptions personnalisées en étendant la classe Exception
(pour les exceptions vérifiées) ou RuntimeException
(pour les exceptions non vérifiées). Ceci est utile lorsque vous souhaitez créer des exceptions spécifiques aux cas d'utilisation de votre application.
la classe publique MinhaExcecao étend l'exception {
public MinhaExcecao (String message) {
soupereuh(message);
}
}
En résumé, la gestion des exceptions en Java est un outil puissant pour créer des programmes robustes et fiables. En comprenant la hiérarchie des exceptions et en sachant comment déclarer, lancer et gérer les exceptions, vous pouvez vous assurer que votre programme gère les situations inattendues de manière contrôlée.