IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

[Exception] UnsupportedOperationException non déclarée comme levée [Débat]


Sujet :

Java

  1. #1
    Membre Expert
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 985
    Par défaut [Exception] UnsupportedOperationException non déclarée comme levée
    Bonjour

    J'ai le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       public void setValue(String key, Object value) {
          if (true) {
             throw new UnsupportedOperationException("Oops, not fully implemented...");
          }
          list.set(key, val);
       }
    Ici on déclenche toujours une exception, me confirmez vous que le code list.set(key, val); ne sera jamais exécuté ?

    De plus , est ce normat qu'il n'y ai pas de throws sur la méthode ?

    Merci d'avance

  2. #2
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Bonjour

    Je confirme et j'affirme que list.set(key, val) ne sera jamais éxecuté.

    C'est normal car UnsupportedOperationException est dérivé de RuntimeException.

  3. #3
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    list.set(key, val); ne sera jamais executé effectivement.

    Il n'y a pas de "throws" car UnsupportedOperationException est ce qu'on appelle une RuntimeException.

    L'intérêt du if(true) est du debug, ça te permet d'executer un bout de code en plus ou à la place d'un autre quand tu es en train de développer.

  4. #4
    Rédacteur
    Avatar de lunatix
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2002
    Messages
    1 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 960
    Par défaut
    c'est moche, mais je m'en sert pour tromper le compilo.
    si tu ne mets pas le if (true), le compilo va refuser de compiler parce que il va te dire que le code apres l'exception ne sera jamais atteint.

    le gars ne voulait pas enlever le code apres, : donc if true, et tu embrouilles le compilo

  5. #5
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 42
    Par défaut
    Salut!

    En général ce style de programmation est utilisé lors des tests pour contourner certains aspets restrictifs du compilateur.
    Par exemple le developpeur voudrais juste tester l'influence de l'exception
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UnsupportedOperationException();
    , s'il avait juste mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    throw new UnsupportedOperationException("Oops, not fully implemented...");
    sans le if(true) le compilateur aurait signaler une erreur concernant la suite de la méthode (list.set(key, val);). Car après un throw (non conditionnelle) on considère que rien n'est plus possible...

  6. #6
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 42
    Par défaut
    Oups!

    Ma réponse est venue trop tard, désolé!

  7. #7
    Membre Expert
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 985
    Par défaut
    Donc dans l'état actuel , un appel à cette méthode déclence l'exception de type runtime dans tous les cas ?

    Cela veut dire qu'un jour le if et l'exception seront retiré, et le code du dessous utilisé ou modifié ?

    C'est pas mieux de mettre un TODO à cet endroit ? ou de faire autrement ?

  8. #8
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut Re: [Info]Intérêt d'une condition if toujours vraie ? + info
    Salut,


    Citation Envoyé par elitost
    De plus , est ce normat qu'il n'y ai pas de throws sur la méthode ?
    Oui... je m'explique : UnsupportedOperationException est une RuntimeException, et ce type d'exception n'a pas besoin d'être déclarée ni catchée. C'est généralement utilisé pour les exceptions dû à des erreurs de compilation (NullPointeurException, ArrayOutOfBoundException, etc...) afin d'éviter de devoir faire des try/catch à tout bout de champs (toutes méthodes peut renvoyer ce type d'exception).

    a++

  9. #9
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Et il serait bien que plus d'API Java utilisent les RuntimeException au lieu des checked exceptions. Cela rendrait leur utilisation bien souvent plus simple.

  10. #10
    Membre chevronné Avatar de gronono
    Inscrit en
    Novembre 2003
    Messages
    457
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Novembre 2003
    Messages : 457
    Par défaut
    Citation Envoyé par Gfx
    Et il serait bien que plus d'API Java utilisent les RuntimeException au lieu des checked exceptions. Cela rendrait leur utilisation bien souvent plus simple.
    uoi mais le code serait moins robuste et les applis planteraient sans savoir pourquoi

  11. #11
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    uoi mais le code serait moins robuste et les applis planteraient sans savoir pourquoi
    Ca dépend comment tu programmes.
    Perso j'ai toujours un catch(Throwable) dans mon UI pour récupérer les erreurs non prévues tels les NullPointer etc... Le code est du coup robuste vu que je ne laisse aucune erreur filtrer sauf si je le souhaite.

    D'ailleurs pour parler du problème dont parle Gfx, j'ai ajouté une classe utilitaire dans mes projets pour encapsuler les différentes exceptions dans une seule, ce qui évite d'avoir throws truc, machin, bidule... mais seulement throws monexceptionparente.

  12. #12
    Rédacteur
    Avatar de lunatix
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2002
    Messages
    1 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 960
    Par défaut
    c'est un peu le principe de Spring qui passe toutes les exceptions en RunTimeException je crois

  13. #13
    Membre éprouvé
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Par défaut
    Citation Envoyé par natha
    uoi mais le code serait moins robuste et les applis planteraient sans savoir pourquoi
    Ca dépend comment tu programmes.
    Perso j'ai toujours un catch(Throwable) dans mon UI pour récupérer les erreurs non prévues tels les NullPointer etc... Le code est du coup robuste vu que je ne laisse aucune erreur filtrer sauf si je le souhaite.

    D'ailleurs pour parler du problème dont parle Gfx, j'ai ajouté une classe utilitaire dans mes projets pour encapsuler les différentes exceptions dans une seule, ce qui évite d'avoir throws truc, machin, bidule... mais seulement throws monexceptionparente.
    Sauf que les RunTimeExceptions ne sont pas prévue pour être "catchés", car ce sont des erreurs de programmation. Donc code plus robuste j'y crois pas. C'est simplement une astuce pour masquer les bug.

  14. #14
    Membre éprouvé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Par défaut
    Ou de la fainéantise de traiter toutes les exceptions comme il se doit ? :p

  15. #15
    Membre éprouvé
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Par défaut
    Citation Envoyé par Satch
    Ou de la fainéantise de traiter toutes les exceptions comme il se doit ? :p
    Oui certainement, c'est bien plus simple de capturer une RuntimeException que de chercherpourquoi elle est lancée.

  16. #16
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Justement, dans ernomement de cas une RuntimeException suffit largement, techniquement et surtout semantiquement.

    gronono > Un programme ne sera pas moins robuste avec des RuntimeException. Au contraire, puisque ce sont des exceptions que l'on ne doit pas "catcher", leur apparition en cours d'execution du programme est une excellente indication d'erreur de programmation/configuration.

    Les checked exceptions ne devraient etre utilisees que pour des erreurs d'environnement qu'on ne peut pas predire. Le cas des IOException est un excellent exemple : cela peur provenir d'une erreur du disque dur, d'une coupure reseau, etc. Des choses que le programmeur ne peut pas corriger.

    Les runtime exceptions, comme il a ete dit, sont la pour notifier les erreurs de programmation que l'on peut corriger. Un excellent exemple est la NumberFormatException.

    Les RuntimeException peuvent etre catchees dans les modules de test de l'application et c'est la que l'on doit pouvoir assurer la viabilite du programme. Je considere donc qu'un usage correct des Runtime/Checked exceptions permet au contraire d'avoir un code plus robuste. L'utilisation des seules checked exceptions conduit bien trop souvent au cas du catch vide, du catch/logging ou du catch/message d'erreur. Si la meme checked exception est levee a chaque execution consecutive du programme alors elle devrait etre une runtime exception car c'est une erreur de programmation (on peut bien sur debattre la dessus en prenant l'exemple d'un disque dur completement foutu en l'air qui generera toujours une IOException).

    Un tres bon exemple de mauvaise checked exception est la XPathExpressionException levee par l'interpreteur XPath du JDK lorsque la requete XPath est mal formee. Une requete XPath n'est pas quelque chose que l'on doit laisser a l'utilisateur le soin d'entrer. Une levee de cette exception est donc signe d'une erreur de configuration (requete statique) ou de programmation (generation dynamique de la requete qui n'a pas marche). Dans certains cas precis, rien n'empeche *en plus* d'intercepter les RuntimeException si la raison en est documentee (exemple validation d'un champ texte ou l'utilisateur doit saisir une requete XPath - on peut imaginer ce scenario dans un outil de developpement).

    Le fait que Java integre les checked exceptions est quelque chose d'excellent mais ce n'est pas une raison d'en abuser. Il ne faut pas suivre aveuglement des preceptes enonces lors de l'apprentissage du langage. Cela me rappelle par exemple l'abus de generation de trio variable privee/getter/setter : on expose sa variable publiquement mais par un moyen detourne qui n'ameliore en rien la securite ou l'architecture de l'API.

  17. #17
    Membre chevronné Avatar de gronono
    Inscrit en
    Novembre 2003
    Messages
    457
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Novembre 2003
    Messages : 457
    Par défaut
    Le probleme vient du fait que l'on ne soit pas obligé de catch les Runtimes exception.
    On devrait toujours les catch au moins au plus au niveau de l'application.

    Prenons par exemple Hibernate qui renvoie des HibernateException (type Runtime).
    Si une erreur se produit (par exemple un champ qui n'existe plus) , alors l'application plante au niveau utilisateur => ce qu'il faut eviter.
    Cacther les RuntimeException permet de prevoir tous les cas (meme ceux qui ne devraient jamais arriver). On peut alors logger (message technique precis) l'erreur et afficher un message à l'utilisateur (message fonctionnel ou bateau suivant la gestion de l'erreur).

    Dans tous les cas, il faudrait toujours traiter les exceptions (les runtimes et les autres).

    Sinon je considere que si l'application peut planter alors l'application n'est pas robuste.
    Exemple un disque dur en mauvais etat ne devrait pas faire planter l'application, mais generer un message d'erreur à l'utilisateur comme quoi la ressource n'est pas disponible.

    Bien sur, chacun fait se qu'il veut.
    La gestion des exceptions depend du besoin de l'application et de l'utilisateur final.

    A+

  18. #18
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Les RuntimeException devraient etre interceptees en phase de test, pas en phase de production. Ce sont des erreurs de programmation qui doivent etre corrigees avant distribution du produit. Les checked exceptions non, car elles dependent de l'environnement.

  19. #19
    Membre chevronné Avatar de NeptuS
    Profil pro
    Inscrit en
    Août 2005
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 392
    Par défaut
    rhhoo ... et ceux qui debug leurs applications au fur et à mesure avec des affichages en console .... on les appelle comment ? des ancètres ??
    Merde .. je savais pas que j'étais si vieux lol

    je sais ... ce post n'a pas beaucoup d'intérêt, juste pour dire que les bonnes vieilles méthodes sont parfois (souvent ?) les meilleures ....

  20. #20
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Rien de ce qui a ete dit au dessus empeche de debugger en console avec des println(). C'est assez rare que j'ai recours a un debugger personnellement.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/05/2011, 17h56
  2. Question sur les exceptions catch / non catch
    Par MrEddy dans le forum Général Java
    Réponses: 2
    Dernier message: 21/10/2010, 12h25
  3. Exception EIBInterBaseError non "catchable"
    Par peter27x dans le forum Bases de données
    Réponses: 3
    Dernier message: 27/02/2009, 14h38
  4. [ADO] Exception Oracle non levée
    Par nguema dans le forum Bases de données
    Réponses: 3
    Dernier message: 27/08/2008, 15h19
  5. exception alphabet non reconnu
    Par matrixspirit dans le forum Bioinformatique
    Réponses: 0
    Dernier message: 24/01/2008, 17h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo