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?
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
.
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) {
...
}