Comment gérer les exceptions Java de la bonne façon

Comment gérer les exceptions Java de la bonne façon / La programmation

En tant que novice en programmation, apprendre à programmer sans stress, comment apprendre à programmer sans stress, vous avez peut-être décidé de vous lancer dans la programmation, que ce soit pour une carrière ou pour votre loisir. Génial! Mais peut-être que vous commencez à vous sentir dépassé. Pas si bien. Voici de l'aide pour faciliter votre voyage. Lire la suite, le concept de gestion des exceptions peut être difficile de faire le tour de la tête. Non pas que le concept lui-même soit difficile, mais la terminologie peut le rendre plus avancé qu’il ne l’est. Et c'est une fonctionnalité tellement puissante qu'elle est sujette aux abus.

Dans cet article, vous apprendrez quelles sont les exceptions, pourquoi elles sont importantes, comment les utiliser et les erreurs courantes à éviter. La plupart des langues modernes 6 Langages de programmation les plus faciles à apprendre pour les débutants 6 Langages de programmation les plus faciles à apprendre pour les débutants Apprendre à programmer consiste à trouver le bon langage, tout autant que le processus d’édification. Voici les six langages de programmation les plus faciles pour les débutants. Read More a une sorte de gestion des exceptions, donc si vous passez de Java 7 Astuces utiles pour maîtriser un nouveau langage de programmation 7 Astuces utiles pour maîtriser un nouveau langage de programmation Vous pouvez vous laisser submerger lorsque vous apprenez à coder. Vous oublierez probablement les choses aussi vite que vous les apprendrez. Ces conseils peuvent vous aider à mieux conserver toutes ces nouvelles informations. Lire plus, vous pouvez prendre la plupart de ces conseils avec vous.

Comprendre les exceptions Java

En Java, un exception est un objet qui indique quelque chose d'anormal (ou “exceptionnel”) s'est produite pendant l'exécution de votre application. Ces exceptions sont jeté, ce qui signifie essentiellement qu'un objet d'exception est créé (similaire à la façon dont les erreurs sont “soulevé”).

La beauté est que vous pouvez capture exceptions levées, ce qui vous permet de traiter la condition anormale et de permettre à votre application de continuer à s'exécuter comme si rien ne s'était passé. Par exemple, alors qu’un pointeur null en C risque de bloquer votre application, Java vous permet de lancer et d’attraper NullPointerExceptions avant qu'une variable nulle ait une chance de provoquer un crash.

Rappelez-vous qu’une exception n’est qu’un objet, mais qu’elle a une caractéristique importante: elle doit être étendue à partir du Exception classe ou toute sous-classe de Exception. Bien que Java comporte toutes sortes d'exceptions intégrées, vous pouvez également créer la vôtre si vous le souhaitez. Parmi les exceptions Java les plus courantes, citons:

  • NullPointerException
  • NumberFormatException
  • Exception d'argument illégal
  • RuntimeException
  • IllegalStateException

Alors, que se passe-t-il lorsque vous lancez une exception?

Tout d'abord, Java examine dans la méthode immédiate s'il existe du code qui gère le type d'exception que vous avez lancée. Si un gestionnaire n'existe pas, il examine la méthode qui a appelé la méthode actuelle pour voir s'il existe un descripteur. Sinon, il examine la méthode appelée cette méthode, puis la méthode suivante, etc.. Si l'exception n'est pas interceptée, l'application imprime une trace de pile, puis se bloque.. (En fait, c'est plus nuancé qu'un simple crash, mais c'est un sujet avancé qui dépasse le cadre de cet article.)

UNE trace de la pile est une liste de toutes les méthodes que Java a traversées lors de la recherche d'un gestionnaire d'exceptions. Voici à quoi ressemble une trace de pile:

Exception dans le fil "main" java.lang.NullPointerException à com.example.myproject.Book.itTle (Book.java:16) à com.example.myproject.Author.getBookTitles (Author.java:25) à com.example. myproject.Bootstrap.main (Bootstrap.java:14)

Nous pouvons en tirer beaucoup. Tout d'abord, l'exception levée était un NullPointerException. Cela s'est passé dans le getTitle () méthode sur la ligne 16 de Book.java. Cette méthode a été appelée de getBookTitles () sur la ligne 25 de Author.java. Cette la méthode a été appelée de principale() sur la ligne 14 de Bootstrap.java. Comme vous pouvez le constater, sachant que tout cela facilite le débogage.

Mais encore une fois, le véritable avantage des exceptions est que vous pouvez “manipuler” la condition anormale en attrapant l'exception, en remettant les choses à plat et en reprenant l'application sans se planter.

Utilisation d'exceptions Java dans le code

Disons que vous avez une méthode () cela prend un entier et exécute une logique qui pourrait casser si l'entier est inférieur à 0 ou supérieur à 100. Cela pourrait être un bon endroit pour lancer une exception:

public void someMethod (int value) if (value < 0 || value > 100) jeter nouveau Exception d'argument illégal();  //…

Pour attraper cette exception, vous devez aller où une méthode () est appelé et utilise le bloc try-catch:

callMethod () try someMethod (200); someOtherMethod ();  catch (IllegalArgumentException e) // gérer l'exception ici //…

Tout dans le essayer block sera exécuté dans l'ordre jusqu'à ce qu'une exception soit levée. Dès qu'une exception est levée, toutes les instructions suivantes sont ignorées et la logique d'application passe immédiatement à la capture bloc.

Dans notre exemple, nous entrons dans le bloc try et appelons immédiatement une méthode (). Comme 200 n’est pas compris entre 0 et 100, un Exception d'argument illégal Est lancé. Ceci met immédiatement fin à l'exécution de une méthode (), ignore le reste de la logique dans le bloc try (someOtherMethod () n'est jamais appelé), et reprend l'exécution dans le bloc catch.

Que se passerait-il si nous appelions une méthode (50) au lieu? le Exception d'argument illégal ne serait jamais jeté. une méthode () exécuterait comme d'habitude. Le bloc try s'exécute normalement, en appelant someOtherMethod () quand someMethod () se termine. Quand someOtherMethod () se termine, le bloc de capture serait sauté et callMethod () continuerait.

Notez que vous pouvez avoir plusieurs blocs catch par bloc try:

callMethod () try someMethod (200); someOtherMethod ();  catch (IllegalArgumentException e) // gérer l'exception ici catch (NullPointerException e) // gérer l'exception ici //…

Notez également qu’une option enfin le bloc existe aussi:

méthode publique void () try //… catch (Exception e) //… finally //…

Le code dans un bloc finally est toujours exécuté quoi qu'il arrive. Si vous avez une instruction return dans le bloc try, le bloc finally est exécuté avant de quitter la méthode. Si vous lancez une autre exception dans le bloc catch, le bloc finally est exécuté avant que l'exception ne soit levée..

Vous devez utiliser le bloc finally lorsque des objets doivent être nettoyés avant la fin de la méthode. Par exemple, si vous avez ouvert un fichier dans le bloc try et que vous avez ensuite lancé une exception, le bloc finally vous permet de fermer le fichier avant de quitter la méthode..

Notez que vous pouvez avoir un bloc finally sans bloc catch:

méthode publique void () try //… finally //…

Cela vous permet d'effectuer le nettoyage nécessaire tout en autorisant les exceptions levées à propager la pile d'appels de méthodes (c'est-à-dire que vous ne voulez pas gérer l'exception ici mais vous devez toujours nettoyer en premier)..

Vérifié par rapport aux exceptions non vérifiées en Java

Contrairement à la plupart des langages, Java distingue entre exceptions vérifiées et exceptions non contrôlées (par exemple, C # n'a que des exceptions non vérifiées). Une exception vérifiée doit être pris dans la méthode où l'exception est levée ou bien le code ne sera pas compilé.

Pour créer une exception cochée, étendez de Exception. Pour créer une exception non contrôlée, étendez-vous de RuntimeException.

Toute méthode qui lève une exception vérifiée doit l'indiquer dans la signature de la méthode à l'aide de la touche jette mot-clé. Depuis que Java est intégré IOException est une exception vérifiée, le code suivant ne sera pas compilé:

public void wontCompile () //… if (someCondition) lance new IOException ();  //…

Vous devez d'abord déclarer qu'il lève une exception vérifiée:

public void willCompile () lève IOException //… if (someCondition) jette un nouvel IOException ();  //…

Notez qu'une méthode peut être déclarée comme générant une exception mais ne lève jamais réellement d'exception. Même dans ce cas, l'exception devra toujours être interceptée ou le code ne sera pas compilé.

Quand faut-il utiliser des exceptions cochées ou non cochées??

La documentation officielle de Java a une page sur cette question. Il résume la différence avec une règle de base succincte: “Si un client peut raisonnablement s'attendre à récupérer d'une exception, faites-en une exception vérifiée. Si un client ne peut rien faire pour récupérer de l'exception, faites-en une exception non contrôlée..”

Mais cette directive peut être obsolète. D'une part, les exceptions vérifiées donnent un code plus robuste. 10 Conseils pour rédiger un code plus propre et plus performant 10 Conseils pour rédiger un code plus propre et plus performant L'écriture de code propre a l'air plus facile qu'elle ne l'est réellement, mais les avantages en valent la peine. Voici comment vous pouvez commencer à écrire du code plus propre aujourd'hui. Lire la suite . D'autre part, aucun autre langage n'a vérifié les exceptions de la même manière que Java, ce qui montre deux choses: premièrement, la fonctionnalité n'est pas assez utile pour être volée par d'autres langages et deux, vous pouvez absolument vivre sans elles. De plus, les exceptions cochées ne fonctionnent pas bien avec les expressions lambda introduites dans Java 8.

Instructions pour l'utilisation des exceptions Java

Les exceptions sont utiles mais faciles à utiliser et à abuser. Voici quelques conseils et meilleures pratiques pour vous aider à ne pas les gâcher..

  • Préférer des exceptions spécifiques aux exceptions générales. Utilisation NumberFormatException plus de Exception d'argument illégal si possible, sinon utilisez Exception d'argument illégal plus de RuntimeException quand c'est possible.
  • Ne jamais attraper Jetable! le Exception la classe s'étend réellement Jetable, et le bloc catch fonctionne réellement avec Jetable ou toute classe qui étend Throwable. Cependant, le Erreur la classe s'étend aussi Jetable, et vous ne voulez jamais attraper un Erreur parce que Erreurs indique de graves problèmes irrécupérables.
  • Ne jamais attraper Exception! InterruptedException s'étend Exception, donc tout bloc qui attrape Exception sera également attraper InterruptedException, et c'est une exception très importante que vous ne voulez pas déranger (surtout dans les applications multithreads) à moins de savoir ce que vous faites. Si vous ne savez pas quelle exception capturer à la place, pensez à ne rien attraper.
  • Utilisez des messages descriptifs pour faciliter le débogage. Lorsque vous lancez une exception, vous pouvez fournir un Chaîne message comme argument. Ce message est accessible dans le bloc catch à l’aide de la touche Exception.getMessage () méthode, mais si l'exception n'est jamais interceptée, le message apparaîtra également dans la trace de la pile.
  • Essayez de ne pas attraper et ignorer les exceptions. Pour éviter les inconvénients des exceptions vérifiées, de nombreux programmeurs débutants et paresseux vont configurer un bloc catch, mais le laisser vide. Mal! Manipulez-le toujours avec élégance, mais si vous ne le pouvez pas, imprimez au moins une trace de pile afin de savoir que l'exception a été levée. Vous pouvez le faire en utilisant le Exception.printStackTrace () méthode.
  • Méfiez-vous des exceptions trop utilisées. Quand vous avez un marteau, tout ressemble à un clou. Lorsque vous découvrez les exceptions pour la première fois, vous pouvez vous sentir obligé de tout transformer en exception… au point où l'essentiel du flux de contrôle de votre application se résume à la gestion des exceptions. Rappelez-vous, les exceptions sont destinées à “exceptionnel” des occurrences!

Maintenant, vous devriez être assez à l'aise avec les exceptions pour comprendre ce qu'elles sont, pourquoi elles sont utilisées et comment les intégrer dans votre propre code. Si vous ne comprenez pas bien le concept, c'est bon! Il m'a fallu un certain temps pour que ça “Cliquez sur” Dans ma tête, alors ne vous sentez pas obligé de vous précipiter 6 signes que vous n'êtes pas censé être programmeur 6 signes que vous ne devez pas être programmeur Ce n'est pas tout le monde qui est programmé. Si vous n'êtes pas complètement sûr d'être censé être un programmeur, voici quelques signes qui peuvent vous orienter dans la bonne direction. Lire la suite . Prends ton temps.

Vous avez des questions? Connaissez-vous d'autres astuces relatives aux exceptions que j'ai manquées? Partagez-les dans les commentaires ci-dessous!

En savoir plus sur: Java.