2010-05-04 2 views
1

L'utilisation du mot-clé return dans le code Java renvoie l'exécution au dernier code appelant de la pile d'appels. Si l'objet foo appelle baz.bar(), le mot-clé return dans la méthode bar continuera l'exécution de code dans foo.Java revient à la position N dans la pile d'appel

Disons que j'ai foo objet qui appelle foofoo qui appelle foofoofoo dans le scénario ci-dessus, et foofoofoo appels baz.bar(). Y at-il de toute façon en Java pour utiliser le mot-clé return, ou quelque chose d'autre, de sorte que le code dans la méthode bar peut retourner jusqu'à foo?

(SANS LANCER EXCEPTIONNELLEMENT)

Répondre

2

Non, cela est impossible. Vous devrez gérer cela vous-même par le code, un niveau à la fois (une exception fera de même, elle est juste automatisée un peu plus).

Cependant, ce n'est probablement pas une bonne idée de le faire de toute façon. Supposons que vous deviez soudainement appeler baz.bar() de quux, sans toucher foo du tout. Que devrait-il se passer si bar essaie de retourner à foo, qui ne fait pas partie de la pile d'appels? Si vous voulez juste qu'il monte N niveaux, pouvez-vous imaginer les problèmes qui pourraient se produire si vous fusionnez foofoofoo en foofoo, ou le changer pour ajouter un foofoofoofoo, sans vous souvenir de modifier bar?

Une exception sonne exactement comme l'outil pour ce travail: baz.bar() ne devrait pas prendre soin qu'il doit aller à foo, il doit savoir quelque chose exceptionnel a eu lieu, l'obligeant à abandonner ce qu'il fait, puis foo devrait savoir que cette situation exceptionnelle peut se produire et la gérer (même si c'est juste ne rien faire est ce cas). Si c'est pour éviter d'ajouter une clause throws à tout, utilisez plutôt une exception non cochée.

+0

Il ne s'agit pas d'éviter une clause throws, cela me semble tout de même bien d'utiliser Exceptions pour le contrôle du flux. – Finbarr

+0

Si vous êtes en mesure de vérifier ce critère avant tout cela, vous pouvez le faire à la place - mais parfois, cela ne peut pas être déterminé à l'avance, et vous devrez lancer l'exception si cela ne fonctionne pas en dehors. –

0

Je ne suis pas un gars énorme Java, donc je ne peux pas dire à coup sûr, mais cela ne ressemble pas à une chose sûre à faire et je doute que cela être pris en charge en Java.

Maintenant, ce sont C/C++, vous pouvez faire un peu sale hack qui écrase l'adresse de retour sur la pile ...

+0

Était-ce C/C++ ma vie serait pleine de petits hacks sales, j'en suis sûr. :-) Cependant, vous pouvez avoir un point. – Finbarr

+0

@Finbarr Alors qu'en Java nous réécrivons proprement le bytecode sur la charge de classe. –

+0

@Tom point pris. Toujours pas aussi hacky que C, on espère. – Finbarr

1

Heureusement, cela est impossible en Java.

Il y a de rares cas où des choses similaires ont du sens, par exemple lorsque vous faites du changement de contexte dans un noyau de système d'exploitation.

Mais ce n'est absolument pas la bonne chose à faire dans les programmes d'application.

+0

Je ne pensais pas que c'était possible d'être honnête, probablement à juste titre. – Finbarr

Questions connexes