Quelle est l'exception standard pour lancer Java pour les opérations non prises en charge / implémentées?

308

En particulier, existe-t-il une Exceptionsous - classe standard utilisée dans ces circonstances?

Krishna Kumar
la source
Est-il approprié d'utiliser lorsqu'une classe n'implémente pas de méthode, mais que les classes enfants peuvent le faire? En d'autres termes, avoir une méthode abstraite dans une classe non abstraite.
osa
@SergeyOrshanskiy C'est utile lorsque, selon la façon dont vous construisez un objet, vous devez créer une classe anonyme qui implémente une interface afin d'instancier une variable membre, mais vous ne voulez pas qu'elle soit utilisée. Si vous le définissez nullet que vous l'utilisez accidentellement (ou que quelqu'un d'autre l'a fait), vous obtiendrez des éléments NullPointerExceptionsmoins évidents que UnsupportedOperationExceptionsdans ce cas. Juste un exemple.
2rs2ts

Réponses:

438

java.lang.UnsupportedOperationException

Lancé pour indiquer que l'opération demandée n'est pas prise en charge.

dfa
la source
4
@JarrodRoberson OK, cette instruction devrait vraiment être supprimée de la documentation de classe dans ce cas. L'exception semble être utilisée par d'autres packages. Je suppose que si Oracle le fait, nous le devrions aussi. Je déposerai un rapport de bogue.
Maarten Bodewes
1
Sachez que ceci n'est pas contrôlé RuntimeException . Vous n'obtiendrez aucune rétroaction ou assistance dans la gestion de ces exceptions pendant la compilation. Si cela est utilisé pour une méthode tronquée ou un travail en cours, vous devez utiliser une sorte d' exception vérifiée .
TastyWheat
221

Faites la différence entre les deux cas que vous avez nommés:

  • Pour indiquer que l'opération demandée n'est pas prise en charge et ne le sera probablement jamais, lancez un UnsupportedOperationException.

  • Pour indiquer que l'opération demandée n'a pas encore été implémentée, choisissez entre:

    1. Utilisez le NotImplementedExceptionfrom apache commons-lang qui était disponible dans commons-lang2 et a été rajouté à commons-lang3 dans la version 3.2.

    2. Mettez en œuvre le vôtre NotImplementedException.

    3. Lancez un UnsupportedOperationExceptionavec un message comme "Pas encore implémenté".

steffen
la source
1
J'y vais, car cela me semble raisonnable. «Pourtant» ou «jamais» indiqué par l'exception donne une idée de la façon de réagir à ce sujet.
sschrass
3
Les # 1 ou 2 sont largement préférables en pratique. # 3 capture la distinction sémantique entre "non pris en charge" et "non implémenté", mais le fait d'avoir une classe distincte facilite la recherche rapide pour vérifier que vous n'avez pas oublié d'implémenter tout ce que vous devriez avant de valider.
Sean U
4
# 3 est préférable pour les méthodes non implémentées car il ne nécessite pas de bibliothèque tierce ou de travail supplémentaire, même s'il s'agit de commons-lang.
JoshDM
28

Si vous créez une nouvelle fonction (pas encore implémentée) dans NetBeans , elle génère un corps de méthode avec l'instruction suivante:

throw new java.lang.UnsupportedOperationException("Not supported yet.");

Par conséquent, je recommande d'utiliser l' exception UnsupportedOperationException .

Benny Neugebauer
la source
14

Si vous voulez plus de granularité et une meilleure description, vous pouvez utiliser NotImplementedException de commons-lang

Avertissement: disponible avant les versions 2.6 et après les versions 3.2 uniquement.

Guillaume
la source