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

avec Java Discussion :

Est-ce que Exception elle-même est checked ?


Sujet :

avec Java

  1. #1
    Membre du Club

    Inscrit en
    Janvier 2006
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 44
    Points : 64
    Points
    64
    Par défaut Est-ce que Exception elle-même est checked ?
    Bonjour à tous

    Je suis en train de passer ma certif et je suis devant un os :

    Etant donné cette classe


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class TryTheTry { 
     public static void main(String[] args) {
      try{}
      //insert code here
      {}
      finally{  }
     }
    }
    class CheckedException extends Exception{}
    class UncheckedException extends RuntimeException{}


    Que mettre à la place de //insert code here pour que cette classe compile, choisissez toutes les réponses qui conviennent.

    1. catch(Exception e)
    2. catch(CheckedException e)
    3. catch(RuntimeException e)
    4. catch(UncheckedException e)


    La réponse est un peu troublante

    La 1, 3 et 4 sont les bonnes réponses.

    En effet la 2 ne compile pas car CheckedException est considéré comme checked (elle n'hérite pas de RuntimeException) donc le compilateur exige que le bloc try envoie cette exception ou invoque une méthode qui déclare pouvoir l'envoyer.

    Dans ce cas et si comme moi vous avez un peu tendance à vous poser les questions jusqu'au bout vous vous dites que Exception n'est pas vu comme une exception checked parceque la 1 compile.

    Ok mais alors ...

    Ca ne compile pas


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void doStuff { throw new Exception(); }


    alors que celui la compile


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void doStuff { throw new RuntimeException(); }
    De ce point de vue on a le sentiment que Exception est vu comme checked.

    Donc je sais pas finalement si Exception est vu comme checked. N'hésiter pas à me faire connaitre votre point de vue.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Crée l'arbre :
    +Exception
    ++RuntimeException
    +++UncheckedException
    ++CheckedException.

    Si tu attrapes une RuntimeException, tu dois pouvoir l'attraper en tant qu'Exception. Cela ne me semble donc pas du tout illogique. C'est étrange, mais c'est un comportement normal, je trouve.

  3. #3
    Membre du Club

    Inscrit en
    Janvier 2006
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 44
    Points : 64
    Points
    64
    Par défaut
    oui c'est aussi ce que je me suis dit après tout exception pourrait bien ne pas être checked mais si on peut accepter cette considération alors

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public void doStuff { throw new Exception(); }
    devrait compiler car Exception pourrait être de type Runtime, or ça compile pas, je persiste à voir une incohérence du langage.

  4. #4
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Comme tu l'as dit, une Exception pourrait être une RuntimeException... comme cela pourrait ne pas l'être...

    Il n'y a pas d'incohérence et de plus Exception est bien définit comme une checked-exception (il n'y a pas de CheckedException comme indiqué dans ton message).

    a++

  5. #5
    Membre du Club

    Inscrit en
    Janvier 2006
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 44
    Points : 64
    Points
    64
    Par défaut
    il n'y a pas de CheckedException comme indiqué dans ton message
    Evidemment puisque que je la crée pour les besoins de mon exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    class CheckedException extends Exception{}
    class UncheckedException extends RuntimeException{}
    Je sais que par ailleurs elle n'existe pas dans les apis java.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    try{}catch(Exception e){}
    compile (pourtant Exception est checked)
    alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    try{}catch(FileNotFoundException e){}
    compile pas (normal FileNotFoundException est checked)

    Pourquoi ce qui semble être une incohérence n'en est pas une ?

    Réponse de dingoth

    Si tu attrapes une RuntimeException, tu dois pouvoir l'attraper en tant qu'Exception
    ok

    donc si je pousse la cohérence jusqu'au bout :

    si j'envoie une RuntimeException je dois pouvoir l'envoyer en tant qu'Exception

    pourtant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void doStuff { throw new Exception(); }
    compile pas

    Ou alors la règle dont j'ignorais l'existence et qui m'est maintenant révélé (Amen)

    • Si tu attrapes une RuntimeException, tu dois pouvoir l'attraper en tant qu'Exception
    • Si tu envoies une RuntimeException, tu ne dois pas pouvoir l'envoyer en tant qu'Exception


    Je persiste à trouver ça louche, même si ça m'enpeche pas de travailler

  6. #6
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    C'est juste une notion d'héritage : Comme RuntimeException hérite de Exception, on peut utiliser un catch(Exception) pour attraper une RuntimeException...


    En ce qui concerne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    try{}catch(FileNotFoundException e){}
    Ce code ne compile pas car le compilateur détecte que le catch est totalement inutile : dans le code du bloc try (vide) il n'y a aucune méthode qui déclare renvoyé une FileNotFoundException, donc l'exception ne pourra pas être renvoyé (je rappelle que pour remonter une checked-exception il faut obligatoirement la déclarer dans la signature de la méthode).

    Toutefois cette vérification n'est pas présente sur les RuntimeException car il n'est pas possible de savoir si une méthode peut remonter une uncheked-exception ou non. De ce fait la vérification n'est pas effectué non plus pour les catch(Exception) car une unchecked-exception peut toujours remonter...


    a++

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Je crois que tu pousses trop le raisonnement.

    Exception DOIT être déclarée puisque vérifiée, tandis que RuntimeException (et ses descendantes) NE doit PAS être déclarée, puisque non-vérifiée. Voir le site de Sun.

    En résumé, trois types d'exceptions :
    * Vérifiée : toute exception héritant de Exception, SAUF les non-vérifiées. DOIT être déclarée
    * Non-vérifiée : toute exception héritant de RuntimeException. Ne doit pas être déclarée
    * Erreur : là, on est hors du cadre des exception, mais il ne faut SURTOUT PAS les attraper.

    À mon avis, la cohérence à laquelle tu t'attends est différente de celle utilisée. Et ça se comprend. Mais dans le cas de la réception des exceptions, la cohérence de l'héritage de classe est supérieure à la cohérence des types checked/unchecked.

  8. #8
    Membre du Club

    Inscrit en
    Janvier 2006
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 44
    Points : 64
    Points
    64
    Par défaut
    En ce qui concerne :
    Code :

    try{}catch(FileNotFoundException e){}

    Ce code ne compile pas car le compilateur détecte que le catch est totalement inutile : dans le code du bloc try (vide) il n'y a aucune méthode qui déclare renvoyé une FileNotFoundException, donc l'exception ne pourra pas être renvoyé (je rappelle que pour remonter une checked-exception il faut obligatoirement la déclarer dans la signature de la méthode).
    Ok alors pourquoi le compilateur il détecte pas que c'est inutile ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    try{}catch(Exception e){}

  9. #9
    Membre du Club

    Inscrit en
    Janvier 2006
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 44
    Points : 64
    Points
    64
    Par défaut
    Bon excusez-moi

    Je pense que j'arrive pas à exprimer ma difficulté de compréhension correctement.

    Cette discussion n'a pas en soit un très grand intéret je propose qu'on l'abandonne.

    Merci pour vos réponses.

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Citation Envoyé par michaelcourcy Voir le message
    Ok alors pourquoi le compilateur il détecte pas que c'est inutile ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    try{}catch(Exception e){}
    Tout simplement parce que parmi les Exceptions, il y a la RuntimeException. Et que quelqu'un peut très bien décider de l'attraper. Cette portion de code ne compile QUE pour attraper les RuntimeException. Ce code est donc d'un point de vue logique strictement équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    try{}catch(RuntimeException e){}

Discussions similaires

  1. Réponses: 5
    Dernier message: 02/12/2009, 14h57
  2. Est-ce que le session id est unique à vie ou pas ?
    Par davitz38 dans le forum Langage
    Réponses: 4
    Dernier message: 18/12/2007, 17h31
  3. Exception TypeLoadException : qu'est ce que c'est?
    Par Masmeta dans le forum Windows Forms
    Réponses: 2
    Dernier message: 24/10/2007, 08h48
  4. Réponses: 5
    Dernier message: 04/07/2006, 10h17
  5. [Zope]Est-ce que la doube-clic est gérable??
    Par keumlebarbare dans le forum Zope
    Réponses: 2
    Dernier message: 09/06/2005, 11h56

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