Différence entre java.lang.RuntimeException et java.lang.Exception

210

Quelqu'un veuillez expliquer la différence entre java.lang.RuntimeExceptionet java.lang.Exception? Comment puis-je décider lequel prolonger si je crée ma propre exception?

cchampion
la source

Réponses:

181

Généralement, les exceptions RuntimeException sont des exceptions qui peuvent être empêchées par programme. Par exemple NullPointerException, ArrayIndexOutOfBoundException. Si vous vérifiez nullavant d'appeler une méthode, NullPointerExceptioncela ne se produira jamais. De même ArrayIndexOutOfBoundExceptionne se produira jamais si vous vérifiez d'abord l'index. RuntimeExceptionne sont pas vérifiés par le compilateur, c'est donc du code propre.

EDIT : De nos jours, les gens préfèrent RuntimeExceptionparce que le code propre qu'il produit. C'est totalement un choix personnel.

fastcodejava
la source
10
J'aime cet angle des "exceptions d'exécution auraient pu être évitées par l'appelant". Cela signifie que vous (en tant qu'appelant d'une méthode) êtes censé vous assurer que cela n'arrive même pas. Alors que les exceptions vérifiées sont quelque chose que vous ne pouvez pas éviter et sont plutôt tenues de les traiter après coup. (Et oui, puisque tout le monde n'est pas d'accord avec le concept d'exceptions vérifiées et que beaucoup de gens utilisent RuntimeException pour tout, cette distinction est devenue un peu confuse).
Thilo
4
De nos jours, les gens préfèrent également RuntimeException non cochée, car elle est compatible avec le traitement Java 8 Lambda, contrairement aux exceptions vérifiées de type Exception.
Hartmut P.
2
Je soupçonne que la vraie raison pour laquelle les gens attrapent RuntimeExceptionest parce que c'est simple et évite de penser aux différences entre les exceptions vérifiées et non contrôlées. Je pense que la capture d'exceptions d'exécution est une idée terrible, car vous allez intercepter des exceptions irrécupérables telles que NullPointerException.
Dónal
186

En Java, il existe deux types d'exceptions: les exceptions vérifiées et les exceptions non vérifiées. Une exception vérifiée doit être gérée explicitement par le code, tandis qu'une exception non vérifiée n'a pas besoin d'être gérée explicitement.

Pour les exceptions vérifiées, vous devez soit placer un bloc try / catch autour du code qui pourrait potentiellement lever l'exception, soit ajouter une clause "throws" à la méthode, pour indiquer que la méthode peut lever ce type d'exception (qui doit être dans la classe appelante ou au-dessus).

Toute exception qui dérive de "Exception" est une exception vérifiée, tandis qu'une classe qui dérive de RuntimeException n'est pas vérifiée. Les RuntimeExceptions n'ont pas besoin d'être explicitement gérées par le code appelant.

Andy White
la source
3
Pratiquement, il est vrai qu '"il existe deux types d'exceptions", mais pourquoi la documentation Oracle indique-t-elle qu'il existe trois types. Il considère l'erreur comme 3ème type. Je pense que l'erreur n'est pas du tout une exception, c'est juste Throwable (objet), oui, elle imite le comportement des exceptions d'exécution. Qu'en diriez-vous? Oracle doc. réf. docs.oracle.com/javase/tutorial/essential/exceptions/…
Asif Shahzad
3
Une erreur n'est pas censée être détectée (bien qu'elle puisse l'être), vous utilisez généralement des erreurs pour détecter vos propres erreurs lorsque vous travaillez sur un nouveau code. Par exemple, si vous avez une arborescence if if / elseif, le dernier else pourrait simplement lancer Error ("ne s'attendait pas à ce que cette condition se produise") ;. De manière générale, les exceptions ont des cas d'utilisation où elles sont censées se produire, tandis que les erreurs n'ont pas de cas d'utilisation et constituent un bogue.
Danny
5
Mais la blague est que RunTimeException lui-même étend l'exception: D (je sais que cela ne pose aucun problème et la JVM s'occupe de tout le contexte)
Alireza Mohamadi
94

Avant de regarder la différence entre les classes java.lang.RuntimeExceptionet java.lang.Exception, vous devez connaître la Exceptionhiérarchie. Les classes Exceptionet Errorsont dérivées de la classe Throwable(qui dérive de la classe Object). Et la classe RuntimeExceptionest dérivée de la classeException .

Toutes les exceptions proviennent , soit de ExceptionouRuntimeException .

Toutes les exceptions qui en dérivent RuntimeExceptionsont appelées exceptions non vérifiées. Et toutes les autres exceptions sont vérifiées exceptions . Une exception vérifiée doit être interceptée quelque part dans votre code, sinon elle ne sera pas compilée. C'est pourquoi elles sont appelées exceptions vérifiées. En revanche, avec des exceptions non vérifiées, la méthode d'appel n'est pas obligée de la gérer ou de la déclarer.

Par conséquent, toutes les exceptions que le compilateur vous oblige à gérer sont directement dérivées java.lang.Exceptionet toutes les autres que le compilateur ne vous oblige pas à gérer sont dérivées dejava.lang.RuntimeException .

Voici quelques-unes des sous-classes directement connues de RuntimeException .

AnnotationTypeMismatchException,
ArithmeticException,
ArrayStoreException,
BufferOverflowException,
BufferUnderflowException,
CannotRedoException,
CannotUndoException,
ClassCastException,
CMMException,
ConcurrentModificationException,
DataBindingException,
DOMException,
EmptyStackException,
EnumConstantNotPresentException,
EventException,
IllegalArgumentException,
IllegalMonitorStateException,
IllegalPathStateException,
IllegalStateException,
ImagingOpException,
IncompleteAnnotationException,
IndexOutOfBoundsException,
JMRuntimeException,
LSException,
MalformedParameterizedTypeException,
MirroredTypeException,
MirroredTypesException,
MissingResourceException,
NegativeArraySizeException,
NoSuchElementException,
NoSuchMechanismException,
NullPointerException,
ProfileDataException,
ProviderException,
RasterFormatException,
RejectedExecutionException,
SecurityException,
SystemException,
TypeConstraintException,
TypeNotPresentException,
UndeclaredThrowableException,
UnknownAnnotationValueException,
UnknownElementException,
UnknownTypeException,
UnmodifiableSetException,
UnsupportedOperationException,
WebServiceException 
GAJJE82
la source
47

Une exception est vérifiée et une exception RuntimeException n'est pas cochée.

Coché signifie que le compilateur requiert que vous gériez l'exception dans un catch, ou déclariez votre méthode comme la lançant (ou l'une de ses superclasses).

Généralement, lancez une exception vérifiée si l'appelant de l'API est censé gérer l'exception, et une exception non vérifiée si c'est quelque chose que l'appelant ne serait normalement pas en mesure de gérer, comme une erreur avec l'un des paramètres, c'est-à-dire une programmation erreur.

Lawrence Dol
la source
15

Les classes d'exceptions d'exécution (RuntimeException et ses sous-classes) sont exemptées de la vérification au moment de la compilation, car le compilateur ne peut pas établir que des exceptions au moment de l'exécution ne peuvent pas se produire. (de JLS).

Dans les classes que vous concevez, vous devez sous- classer l'exception et en lancer des instances pour signaler tout scénario exceptionnel. En faisant cela, vous signalerez explicitement aux clients de votre classe que l'utilisation de votre classe peut lever une exception et ils doivent prendre des mesures pour gérer ces scénarios exceptionnels.

Les extraits de code ci-dessous expliquent ce point:

//Create your own exception class subclassing from Exception
class MyException extends Exception {
    public MyException(final String message) {
        super(message);
    }
}

public class Process {
    public void execute() {
        throw new RuntimeException("Runtime");
    }  
    public void process() throws MyException {
        throw new MyException("Checked");
    }
}

Dans la définition de classe ci-dessus de la classe Process , la méthode executepeut lever une RuntimeException mais la déclaration de méthode n'a pas besoin de spécifier qu'elle lève RuntimeException .

La méthode processlève une exception vérifiée et elle doit déclarer qu'elle lèvera une exception vérifiée de type MyException et ne pas le faire sera une erreur de compilation.

La définition de classe ci-dessus affectera le code qui utilise Process classe .

L'appel new Process().execute()est une invocation valide où l'appel de formulaire new Process().process()donne une erreur de compilation. En effet, le code client doit prendre des mesures pour gérer MyException(par exemple, l'appel à process () peut être placé dans un bloc try / catch).

sateesh
la source
13

Une bonne utilisation de RuntimeException?

Des exceptions non contrôlées - La controverse :

Si l'on peut raisonnablement s'attendre à ce qu'un client se remette d'une exception, faites-en une exception vérifiée. Si un client ne peut rien faire pour récupérer à partir de l'exception, faites-en une exception non vérifiée.

Notez qu'une exception non RuntimeExceptionvérifiée en est une dérivée et une exception vérifiée en est une dérivée Exception.

Pourquoi lancer un RuntimeExceptionsi un client ne peut rien faire pour se remettre de l'exception? L'article explique:

Les exceptions d'exécution représentent des problèmes qui sont le résultat d'un problème de programmation, et en tant que tel, le code client API ne peut raisonnablement pas s'attendre à en récupérer ou à les gérer de quelque manière que ce soit. Ces problèmes incluent les exceptions arithmétiques, telles que la division par zéro; les exceptions de pointeur, telles que la tentative d'accès à un objet via une référence nulle; et les exceptions d'indexation, telles que la tentative d'accès à un élément de tableau via un index trop grand ou trop petit.

Mahdi Esmaeili
la source
5

Depuis la documentation d'Oracle:

Voici la ligne directrice: si un client peut raisonnablement s'attendre à se remettre d'une exception, faites-en une exception vérifiée. Si un client ne peut rien faire pour récupérer à partir de l'exception, faites-en une exception non vérifiée.

Les exceptions d'exécution représentent des problèmes qui sont le résultat d'un problème de programmation et en tant que tel, le code client API ne peut raisonnablement pas s'attendre à en récupérer ou à les gérer de quelque manière que ce soit.

Les RuntimeExceptions sont comme des "exceptions par utilisation non valide d'une API". Exemples d'exceptions à l'exécution: IllegalStateException, NegativeArraySizeException, NullpointerException

Avec les exceptions, vous devez l'attraper explicitement car vous pouvez toujours faire quelque chose pour récupérer. Des exemples d'exceptions sont: IOException, TimeoutException, PrintException ...

iberck
la source
4

En termes simples, si votre client / utilisateur peut récupérer de l'exception, faites-en une exception vérifiée , si votre client ne peut rien faire pour récupérer de l'exception, faites-en une RuntimeException non vérifiée . Par exemple, une RuntimeException serait une erreur de programmation, comme la division par zéro, aucun utilisateur ne peut rien y faire sauf le programmeur lui-même, alors c'est une RuntimeException .

Joe Almore
la source
3

RuntimeException est une classe enfant de la classe Exception

Il s'agit de l'une des nombreuses classes enfants de la classe Exception. RuntimeException est la superclasse de ces exceptions qui peuvent être levées pendant le fonctionnement normal de la machine virtuelle Java. Une méthode n'est pas tenue de déclarer dans sa clause throws toutes les sous-classes de RuntimeException qui pourraient être levées pendant l'exécution de la méthode mais non interceptées.

La hiérarchie est

java.lang.Object

--- java.lang.Throwable

------- java.lang.Exception

------------- java.lang.RuntimeException

jayrhd
la source
0

Les exceptions sont un bon moyen de gérer les événements inattendus dans votre flux d'application. Les RuntimeException ne sont pas contrôlées par le compilateur, mais vous préférerez peut-être utiliser des exceptions qui étendent la classe d'exception pour contrôler le comportement de vos clients api car ils doivent détecter les erreurs à compiler. Forme également une bonne documentation.

Si vous souhaitez obtenir une interface propre, utilisez l'héritage pour sous-classer les différents types d'exceptions de votre application, puis exposez l'exception parent.

FOO
la source
0

Il existe deux types d'exceptions, vous pouvez récupérer à partir d'une exception vérifiée si vous obtenez ce type d'exception. Les exceptions à l'exécution sont irrécupérables, les exceptions à l'exécution sont des erreurs de programmation, et le programmeur doit s'en occuper lors de l'écriture du code, et poursuivre son exécution pourrait vous donner un résultat incorrect. Les exceptions d'exécution concernent la violation de la condition préalable ex. vous avez un tableau de taille 10 et vous essayez d'accéder au 11 e élément, il lèvera ArrayIndexOutOfBoundException

Bhagwati Malav
la source
0
  1. L'exception définie par l'utilisateur peut être une exception vérifiée ou une exception non vérifiée. Cela dépend de la classe à laquelle elle s'étend.

  2. L'exception définie par l'utilisateur peut être une exception vérifiée personnalisée, si elle s'étend à la classe Exception

  3. L'exception définie par l'utilisateur peut être une exception personnalisée non vérifiée, si elle s'étend à la classe d'exception d'exécution.

  4. Définir une classe et en faire un enfant de l'exception ou de l'exception d'exécution

Aditya
la source