Craignez les erreurs, mais ne les écrivez pas en Java ! Vous savez probablement déjà quelques petites choses sur les exceptions en Java . Aujourd'hui, au moins une connaissance superficielle vous sera bénéfique. Nous allons analyser la classe Error et un type d'exception spécial qui effraie beaucoup de gens lorsqu'il apparaît dans leurs traces de pile.

Au sommet de la hiérarchie des exceptions de Java se trouve la classe Throwable , qui a deux descendants :

  • Exception , qui est responsable des erreurs dans votre programme.
  • Et notre héros d'aujourd'hui — Error , qui est responsable des erreurs dans la JVM.
    Il convient de mentionner qu'il ne s'agit probablement même pas de bogues de codage, mais plutôt de problèmes qui ne dépendent généralement pas du développeur.

Que faire avec une erreur

Lors de la capture des "erreurs", vous ne pouvez effectuer aucune action dans le bloc catch , à l'exception de la journalisation , car nous parlons de problèmes dans la JVM elle-même.

La journalisation est bonne : lorsque vous obtenez une erreur d'exécution, vous pouvez consulter les journaux, voir sa cause et savoir quoi corriger.

Puisque vous ne savez pas quel type d'erreur vous pourriez obtenir lorsque vous écrivez votre code, cela n'a aucun sens d'écrire un type particulier dans le bloc catch . Utiliser la classe Error elle-même n'est pas non plus la meilleure solution, car dans ce cas, vous n'attraperez que des erreurs.

Par conséquent, il est préférable d'utiliser la classe Throwable , qui peut intercepter à la fois Error et Exception . Comment cela se présente-t-il en pratique ?

Ce n'est pas correct d'écrire du code comme celui-ci :

try {
    // Your code
} catch (OutOfMemoryError outOfMemoryError) {
    // Code to catch OutOfMemoryError
}
Écrire un code comme celui-ci n'est pas non plus acceptable :

try {
    // Your code
} catch (Error error) {
    // Code to catch all Errors
}
Mais un code comme celui-ci est OK :

try {
    // Your code
} catch (Throwable throwable) {
    // Code to catch all Throwables
}

La deuxième option pour gérer les erreurs consiste à les lancer plus haut après avoir déclaré une clause throws sur la méthode. Cette technique est utilisée lorsque votre code pourrait théoriquement générer une erreur et que vous souhaitez avertir tous ceux qui pourraient utiliser votre code afin qu'ils puissent gérer correctement l'erreur.

Erreurs courantes

Certaines des erreurs les plus courantes sont les classes OutOfMemoryError et StackOverflowError .

OutOfMemoryError apparaît souvent lorsque le programme n'a pas assez de mémoire pour créer des objets et que le ramasse-miettes ne peut pas suivre. Le résultat est une OutOfMemoryError .

Java ne vous permet pas de supprimer manuellement des objets pour éviter les fuites de mémoire, mais vous pouvez éviter les déchets afin de ne pas surcharger le ramasse-miettes et de ne pas encombrer le tas.

Par exemple, un code comme celui-ci créera beaucoup de déchets en mémoire :


while (true) {
    new Object();
}

La deuxième erreur dont je veux vous parler est la StackOverflowError , qui est levée lorsque la pile déborde. Étant donné que la pile stocke principalement des variables locales, des paramètres et des appels de méthode, la récursivité (ou un appel de méthode récursif) est une cause très courante de cette erreur :


public void foo() {
    foo();
}

Pour éviter les problèmes lors de l'exécution du programme, les IDE modernes mettent souvent en garde contre l'appel récursif des méthodes.

Vous ne pouvez pas réparer un programme qui génère des Errors , mais vous pouvez écrire du code qui ne générera pas d'erreur et ne cassera pas votre programme. Faites attention à ce que vous faites avec la mémoire, créez des objets avec soin et appelez les méthodes correctement. Si vous faites cela, vous aurez moins de problèmes dans votre code.

Différence entre les types d'erreur et d'exception

Erreur Exception
Ne peut pas être corrigé dans le bloc catch Peut être manipulé dans un bloc catch
Ne se produit pas au moment de la compilation Peut être intercepté au moment de la compilation
Problèmes dans la JVM Problèmes dans la logique du code
Toutes les erreurs sont décochées vérifié et décoché

Vous ne pouvez pas échapper aux exceptions en Java, mais vous ne devriez pas en avoir peur. Vous avez juste besoin de comprendre ce que chaque type représente et de savoir comment le gérer. C'est tout pour aujourd'hui! À bientôt!