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 :

comportement try finally


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 6
    Par défaut comportement try finally
    bonjour à tous,

    je suis en train de préparer la certif SCJP et j'en suis à regarder le fonctionnement du try/finally sans de block catch et je tombe pas hasard sur un comportement qui m'interpelle.

    voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public class TryFinallyTest{
     
             public int testMethod(){
                  int i=2;
                  try {
                       return i++;
                  }
                  finally {
                       System.out.println(i+ " dans le finally");
                  }
            }
     
            public static void main(String []args){
                  TryFinallyTest tft = new TryFinallyTest();
                  System.out.println(tft.testMethod()+" retourné");
            }
    }
    et le résultat de ce superbe code est :
    3 dans le finally
    2 retourné

    je trouve ça bizarre je m'attendais plutôt à
    2 dans le finally
    2 retourné
    car le return est censé être éxécuté après le block finally et donc la postincrémentation n'aurait pas du entrer en jeu.

    on dirait qu'en fait le return i; est mémorisé en attendant son éxécution, la post incrémentation est alors faite, le finally se lance et le return éxécuté.

    est-ce vraiment le comportement dans ce type de cas ?

  2. #2
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 111
    Par défaut
    je ne suis pas expert, mais ca me parait bizarre aussi.

    le finally a l'air d'etre un cas particulier.

    je pense qu'il faut le voir comme ceci :
    le bloc try est executé integralement et dans tous les cas avant de poursuivre l'execution le bloc finally serat exécuté.

  3. #3
    Membre chevronné Avatar de Rayndell
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 289
    Par défaut
    Si c'était le cas, la fonction devrait de toutes façons retourner 3. Pourquoi t'attends-tu à ce qu'elle retourne 2 ? Le comportement que tu as décrit doit être ce qui se passe, mais ça me paraît étrange...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 81
    Par défaut
    Non, il n'y a pas d'erreur.

    Quand tu marque :
    c'est traduit en gros comme ca :
    return i;
    i = i + 1 ;

    Par contre si tu marque :
    Tu obtient bien :
    i = i + 1 ;
    return i ;


    De plus, quand tu utilise un try/catch/finally ou try/finally.
    Le try est toujours éxécuté en premier et en dernier tu as le finally mais jamais l'inverse.

    Dans ton cas je pense que Java traduit ca comme ca :
    - je rentre dans la try
    - je mémorise le résultat du return
    - j'incrémente i
    - je rentre dans le finally
    - j'affiche le message
    - enfin je return le résultat du return

  5. #5
    Membre chevronné


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 855

  6. #6
    Membre éprouvé Avatar de baroudi
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 117
    Par défaut
    deja un truc , tu devrais avoir un return toto(de type int)dans ta fonction ??!!

    ça marche quand même ?

  7. #7
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par dams77
    Non, il n'y a pas d'erreur.

    Quand tu marque :
    c'est traduit en gros comme ca :
    return i;
    i = i + 1 ;
    Je dirais que c'est plus un bug de java, car ta traduction n'est pas licite (unreachable code)...

  8. #8
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ®om
    Je dirais que c'est plus un bug de java, car ta traduction n'est pas licite (unreachable code)...
    C'est vrai, si on faisait l'équivalent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    return i;
    i += 1;
    il aurait généré une erreur... bizarre
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

    Citation Envoyé par ®om
    Je dirais que c'est plus un bug de java, car ta traduction n'est pas licite (unreachable code)...
    Non ce n'est pas un "bug", mais le comportement normal de i++

    Citation Envoyé par OButterlin
    C'est vrai, si on faisait l'équivalent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    return i;
    i += 1;
    il aurait généré une erreur... bizarre
    C'est normal que le compilateur ne génère pas d'erreur : le code Java est correct.

    Cette code peut se résumer en trois étape :
    1. On évalue l'expression qui sera retourné (i++ ici), ce qui donne en fait i, soit 2 dans ce cas) puisque le ++ est effectué après l'expression. La valeur de retour est donc 2
    2. L'opérateur ++ est ensuite effectué, i passe donc à 3.
    3. Et enfin la valeur de retour est renvoyé, donc 2.


    L'équivalent serait donc plutôt quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int ret = i;
    i += 1;
    return ret;
    Le finally vient donc s'insérer entre l'étape 2 et 3...

    a++

Discussions similaires

  1. problème avec try except et try finally !?
    Par jano_dave dans le forum Débuter
    Réponses: 2
    Dernier message: 15/09/2009, 14h55
  2. Eviter les bugs : try finally ?
    Par Coussati dans le forum Débuter
    Réponses: 6
    Dernier message: 20/02/2008, 10h13
  3. [D7]Problème Try Finally End
    Par delphi5user dans le forum Delphi
    Réponses: 12
    Dernier message: 17/04/2007, 16h37
  4. Réponses: 9
    Dernier message: 12/03/2007, 23h43
  5. Des conséquences du try...finally
    Par fulster dans le forum Langage
    Réponses: 3
    Dernier message: 15/03/2006, 01h57

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