La plupart des réponses sur ce forum parlaient de la hiérarchie Exception et du compilateur Java, mais j'essaierais d'y répondre davantage du point de vue de la conception et pourquoi les choses ont peut-être été conçues comme ça.
Fondamentalement, lorsque vous appelez une fonction (ou écrire du code) une exception peut être jeté hors de celui-ci repose sur trois situations différentes:
Basé sur une condition inévitable comme indisponibilité du réseau ou d'un fichier attendu manquant sur le système de fichiers.
Sur la base d'un évitable, mais condition connue comme Integer.parseInt(String)
peut jeter NumberFormatException
si l'appelant passe une chaîne inconvertibles comme "Hello"
, mais l'appelant peut assurer la validation appropriées en place avant de passer dans une chaîne à la fonction et complètement faire disparaître avec la possibilité de générer l'exception. Un cas d'utilisation courant pourrait être la validation du champ de formulaire age
sur une page Web avant de le transmettre aux couches plus profondes qui effectuent la conversion.
Une condition connue ou inconnue tout moment une ligne de code peut lancer une exception dans votre code parce qu'il y avait une erreur que vous avez fait et n'a pas respecté les conditions d'erreur jusqu'à ce qu'il décollait dans la production, se produit généralement avec NullPointer Reference
, IndexOutOfBounds
etc, qui, si elle observé serait peut-être tomber dans la catégorie 2.
exceptions de la catégorie 1 sont généralement conçus comme Checked Exceptions
parce qu'il a besoin de faire respecter la vérification des conditions d'erreur inévitables, et de faire valoir leurs solutions de repli. Par exemple, IOException est une exception vérifiée, car si vous ouvrez un fichier, il peut y avoir beaucoup de choses qui peuvent mal tourner (comme le fichier peut être supprimé, les permissions etc.) et la validation préalable peut être très lourde. Les exceptions du 2ème type sont généralement modélisées comme Unchecked Exceptions
parce que vous pourriez avoir votre pré-validation en place et il pourrait être irritant d'être obligé d'utiliser essayer et attraper pour les situations que vous avez déjà pris en charge.
Les exceptions du 3ème type ne doivent pas être même généralement inquiétées parce que vous ne pouvez pas mettre la gestion des erreurs dans chaque déclaration de code d'application qui peut apparaître de façon inattendue. Mais parfois, vous pouvez placer un gestionnaire global, quelque part tout à fait dans la pile d'appels d'où presque tout le code d'application est exécuté et le gérer de manière générique afin que votre application ne plante pas en raison d'une erreur inattendue. Par exemple, si vous exécutez une application Web, vous pouvez configurer votre conteneur de servlet pour qu'il envoie un message générique 500 Internal Server Error
pour toute erreur non gérée dans votre application. Ou, si vous exécutez une application Java autonome, vous pouvez conserver le contenu de votre main method
dans un bloc try catch
pour empêcher le blocage de l'application.
Notez que 'RuntimeExceptions' sont généralement lancées lorsqu'une erreur de programmation/code est survenue. La solution est généralement juste en corrigeant le code. Vous ne devriez généralement pas les attraper. – BalusC
Vraiment? Je crois que l'une des meilleures pratiques est de convertir l'exception vérifiée à l'exception non vérifiée que les attraper tous à un endroit pour afficher à l'utilisateur? – vodkhang
@vodkhang Ce que j'essaie de dire est pourquoi le compilateur n'interdit pas un code quand il est clair qu'il y a une RuntimeException qui se produira. –