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

Langage Java Discussion :

Finally, quel est l'intérêt en fin de compte ?


Sujet :

Langage Java

  1. #1
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Points : 340
    Points
    340
    Par défaut Finally, quel est l'intérêt en fin de compte ?
    Bonjour, voila quelques temps que je me pose cette question, et j'en viens à me demander si je sais vraiment utiliser finally : Quel est l'intéret du bloc finally ?

    Quelle différence entre faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    try {
           inputStream.open();
    } catch(Exception e) {
           e.printStackTrace();
    } 
    finally  {
          inputStream.close();
    } 
    blabla

    Et faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    try {
           inputStream.open();
    } catch(Exception e) {
           e.printStackTrace();
    } 
     
    inputStream.close();
    blabla;
    C'est un simple problème de clarté de code, ou j'ai raté un truc ?

  2. #2
    Membre habitué
    Profil pro
    Développeur Java
    Inscrit en
    Juin 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2009
    Messages : 102
    Points : 172
    Points
    172
    Par défaut
    Comme tu as du le lire ailleurs, le code contenu dans finally sera toujours exécuté, même si il y a une exception. Ce n'est pas le cas du reste de la méthode !!

    Dans ton premier exemple, ton inputStream sera fermé (bon exemple, c'est typiquement un cas d'utilisation), mais blabla ne sera pas exécuté.

    Dans ton second exemple, ni ton inputStream, ni blabla ne sera exécuté, ce qui pourra laisser un flux vers un fichier ouvert (par exemple), et donc en interdire un accès ultérieur.

  3. #3
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Points : 340
    Points
    340
    Par défaut
    Bah si, le reste sera exécuté, vu que c'est en dehors du bloc try ...

  4. #4
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 165
    Points : 137
    Points
    137
    Par défaut
    Vu ton catch, le blabla sera executé.
    Mais selon ce dont tu mets dans don Catch comme un throw ... le blabla ne sera pas exécuté, sauf si tu le mets dans un bloc Finally.

    SUIS PAS SÛR

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Points : 909
    Points
    909
    Par défaut
    Là tu as un catch Exception qui ne fait "rien" (dans le sens où toutes les exceptions sont masquées par cette clause catch, et qu'aucune exception ne sera levée, et que donc l'instruction suivante sera forcément exécutée).
    Donc effectivement, dans ce cas précis, les deux sont équivalents.


    Autres contextes :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    try {
      // traitement normal
      // traitement final (ex : fermeture des flux)
    }
    catch (Exception1 e) {
      // traitement de l'exception Exception1
    }
    catch (Exception2 e) {
      // traitement de l'exception Exception2
    }
    En cas de levée d'une exception pendant le traitement normal, le traitement final ne sera jamais exécuté...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    try {
      // traitement normal
    }
    catch (Exception1 e) {
      // traitement de l'exception Exception1
    }
    catch (Exception2 e) {
      // traitement de l'exception Exception2
    }
    // traitement final (ex : fermeture des flux)
    En cas de levée d'une exception Exception1 ou Exception2 pendant le traitement normal, le traitement final sera effectivement exécuté...
    MAIS
    - si en fait dans le traitement de l'exception Exception1 on relance l'exception (avec un traitement du type e.printStackTrace() ; throw e; qui se contente de logguer l'erreur avant de la relancer) ? le traitement final ne sera jamais exécuté...
    - si une exception Exception3 non prévue dans le code est levée ? le traitement final ne sera jamais exécuté...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    try {
      // traitement normal
    }
    catch (Exception1 e) {
      // traitement de l'exception Exception1
    }
    catch (Exception2 e) {
      // traitement de l'exception Exception2
    }
    finally {
      // traitement final (ex : fermeture des flux)
    }
    En cas de levée d'une exception pendant le traitement normal, le traitement final sera TOUJOURS exécuté même si une exception est lancée dans les clauses catch, même si c'est une exception non prévue dans le code qui intervient.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try {
      // traitement normal
    }
    finally {
      // traitement final (ex : fermeture des flux)
    }
    En cas de levée d'une exception pendant le traitement normal, le traitement final sera TOUJOURS exécuté avant de transmettre l'exception au niveau supérieur.


    Et enfin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try {
      return 0;
    }
    finally {
      // traitement final (ex : fermeture des flux)
    }
    Le traitement final sera TOUJOURS exécuté avant de transmettre la valeur retournée (ici 0) au niveau supérieur

  6. #6
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Points : 340
    Points
    340
    Par défaut
    Aaaaaah ok, il y avait en effet des détails que j'avais raté. Merci beaucoup !

  7. #7
    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,


    A noter qu'il est préférable d'utiliser un try/finally dans un bloc try/catch, afin d'avoir une gestion unique des exceptions


    Comment libérer proprement les ressources (ou comment utiliser proprement les bloc try/finally) ?


    a++

  8. #8
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 46
    Points : 49
    Points
    49
    Par défaut
    A noter juste que le finally n'est jamais executé si dans le catch il y a un System.exit ......

    Et oui toutes les règles ont une exception...

  9. #9
    Membre actif Avatar de jamesleouf
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 522
    Points : 243
    Points
    243
    Par défaut
    j'ai une autre question:

    Je pensais pourtant que le try/catch servait a interrompre l'exécution;
    OK le finally va s'exécuter mais pourquoi le reste qui suit s'exécute aussi?
    Je pensais pourtant que le but du catch était d'interrompre l'exécution (sauf si dans le bloc de l'exception on lui dit de faire quelque chose pour continuer autrement l'exécution?

  10. #10
    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
    Ben le catch interrompt l'exécution du bloc try correspondant...

    a++

  11. #11
    Membre actif Avatar de jamesleouf
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 522
    Points : 243
    Points
    243
    Par défaut
    mais la suite est exécutée?

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Points : 909
    Points
    909
    Par défaut
    Citation Envoyé par jamesleouf Voir le message
    mais la suite est exécutée?
    "la suite" = ce qui est après le bloc try-catch-finally ?
    Eh bien ça dépend de si une exception est levée ou non dans ce bloc...

  13. #13
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 46
    Points : 49
    Points
    49
    Par défaut
    Bonjour jamesleouf:

    La suite est exécutée sauf s'il y a propagation de l'erreur....
    si dans ton catch tu fais par exmple:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    try{
     
    }catch(Exception e){
         throw new Exception();
    }
     
    System.out.println( );
    Ton System.out ne sera jamais exécuté.
    Si tu le met dans un finally il le sera.

  14. #14
    Membre actif Avatar de jamesleouf
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 522
    Points : 243
    Points
    243
    Par défaut
    Merci tout le monde

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Quel est l'intérêt des mots clé get et set ?
    Par verbose dans le forum ActionScript 3
    Réponses: 2
    Dernier message: 30/09/2008, 16h19
  2. Signature des assemblies : quel est l'intérêt?
    Par AdamReith dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 30/04/2008, 18h20
  3. Réponses: 3
    Dernier message: 16/01/2006, 19h53
  4. Mais quel est l'intérêt de XML ?
    Par darkbauer dans le forum XML/XSL et SOAP
    Réponses: 7
    Dernier message: 01/06/2004, 18h03
  5. Quel est l'intérêt des Services Web ??
    Par silvermoon dans le forum Débats sur le développement - Le Best Of
    Réponses: 19
    Dernier message: 12/02/2003, 22h28

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