Vous aimez ce que vous lisez sur ce blog ?
Envie d'aller plus loin avec véritable formation d'expertise en Java ?
Venez suivre ma formation Masterclasse Expertise Java !

"Même un développeur experimenté a besoin de continuer à apprendre. Et dans cette formation... j'ai appris beaucoup !" - A.G., Java Champion

Sessions intra-entreprises sur demande : contact[at]mokatech.net.
Inscrivez-vous vite !

Java Quiz #8

Que fait le code suivant ?

  1. public class Loops
  2. {
  3. public static int increment(int i)
  4. {
  5. loop: while (true)
  6. {
  7. try
  8. { return (++i);
  9. }
  10. finally
  11. { break loop;
  12. }
  13. }
  14. }
  15.  
  16. public static void main(String... args)
  17. {
  18. System.out.println(Loops.increment(2));
  19. }
  20. }

Réponse :
Ce code ne compile même pas ! Le compilateur signale que la méthode increment() est censée renvoyer une valeur (un int), mais qu'elle n'en fait rien.

Voici pourquoi.
Rappelez-vous le dernier quiz : le bloc finally est toujours exécuté, et prend la main sur toute autre cause de sortie du bloc.

Voyons ce qui se passerait dans notre programme s'il pouvait être exécuté :

  • La méthode main() serait lancée, et appellerait la méthode increment()
  • La boucle (apparemment infinie) débuterait
  • Le bloc try serait exécuté, et renverrait la valeur incrémentée
  • Mais le bloc finally serait exécuté avant la sortie de la méthode, et court-circuiterait le return en indiquant au programme qu'il faut sortir de la boucle et reprendre son exécution à l'instruction suivante.
  • Puisqu'il n'y a aucune instruction supplémentaire après la boucle, la méthode se terminerait sans avoir renvoyé aucune valeur.

Le compilateur, en analysant le flux du programme, détecte cette erreur et refuse donc la compilation.

Conclusion : il est important d'être conscient que toute instruction de contrôle de flux (return, break, continue, les exceptions...) placée au sein d'un bloc finally peut provoquer des effets de bord non prévus et très difficiles à débugger. Il est donc préférable d'éviter cette situation autant que possible.

PS : la boucle infinie et le label n'étaient évidemment là que pour entretenir la confusion :)


Commentaires

1. Le lundi 14 avril 2008, 13:00 par Mialy

Je serais bien tentée de dire qu'il incrémente le nombre qu'on lui fournit mais on sort de la boucle avant d'arriver au return alors ...
Je vais aller voir ce que ça donne ;)

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.