web-dev-qa-db-fra.com

RuntimeException et erreur

Dans la hiérarchie des exceptions, les descendants de RuntimeException et ceux de Error sont des exceptions/erreurs d'exécution.

La différence entre les deux est: Ceux sous RuntimeException sont ceux causés par une mauvaise programmation/conception, et ceux de Error sont les ceux qui ne peuvent/ne devraient pas être contrôlés par le développeur.

Pour coder une exception dans l'application, par exemple, pour lever une exception lorsque quelque chose se produit dans la logique métier, RuntimeException est étendu.

La question est de savoir quelle est exactement la différence entre l'extension RuntimeException et l'extension Error - sauf l'extension Error est une mauvaise pratique?

22
Roam

Error et RuntimeException sont des exceptions non cochées, ce qui signifie qu'elles indiquent une faille avec le programme et ne doivent généralement pas être détectées. (NullPointerException, IndexOutOfBoundsException, etc.)

Je pense que la principale différence entre les deux est que RuntimeException indique qu'il y a une erreur avec le programme, et un Error est quelque chose qui est fatal mais hors du contrôle du programme. (OutOfMemorryError, ThreadDeath, etc.)

Par conséquent sous-classer un Error est une mauvaise pratique car une erreur n'est généralement pas quelque chose qui pourrait être corrigé par votre programme lors de l'exécution. Dans votre programme, si vous avez besoin de lancer quelque chose, utilisez un Exception.

21
Pita

Le Q est, quelle est exactement la différence entre l'extension de RuntimeException et l'extension de Error - sauf que l'extension de Error est une mauvaise pratique?

Vous avez déjà mentionné les principales différences. Le Java Language Specification dit la même chose en termes différents . Pour Error, il indique

Error est la superclasse de toutes les exceptions dont les programmes ordinaires ne sont généralement pas censés récupérer .

Pour RuntimeException, il indique

La classe RuntimeException est une sous-classe directe d'Exception. RuntimeException est la superclasse de toutes les exceptions qui peuvent être levées pour de nombreuses raisons lors de l'évaluation de l'expression, mais à partir de laquelle la récupération peut encore être possible .

Ce que vous devez retenir de ces citations, c'est que vous verrez souvent

try {
   ...
} catch (Exception e) { // catches RuntimeException
   ...
}

comme un cas fourre-tout puisque Exception est un super type de RuntimeException. Mais tu ne verras presque jamais (je ne l'ai jamais vu)

try {
   ...
} catch (Error e) {
   ...
}
7