Alternative à une instruction goto en Java
Ce qui est une autre fonction pour le goto mot-clé en Java?
Depuis Java ne dispose pas d'un goto.
- Vous demandez la curiosité, et vous n'allez pas l'utiliser dans un véritable programme Java, droit?
- son OK ... il ne peut pas, même si il veut 🙂
- Pouvez-vous donner un exemple du type de code que vous écrivez si
goto
est disponible en Java? Je pense que c'est là que réside la question la plus importante. - Je seconde polygene, pourriez-vous s'il vous plaît mettre à jour votre question à indiquer pourquoi votre programme a besoin d'un goto?
- suis dans la boucle while, au cours d'une itération, il y a 3 conditions sur la base des critères de condition, je veux transférer les controlto directement
- En fait, Java a le mot-clé goto cependant il n'existe pas de situation dans laquelle vous pouvez l'utiliser. par exemple, const. Au lieu de goto, vous pouvez utiliser continuer, break, interrupteur, le retour d'un sous-méthode. Cela dépend de ce que vous essayez de faire.
- On parle toujours de ne jamais utiliser un goto, mais je pense qu'il y a vraiment une bonne utilisation dans le monde réel de cas qui est assez bien connu et utilisé.. C'est à dire, faire assurez-vous d'exécuter du code avant un retour de fonction.. en général, sa suppression des verrous ou ce n'est pas, mais dans mon cas, j'aimerais être capable de sauter d'une pause juste avant le retour afin que je puisse faire obligatoire de nettoyage. Bien sûr, un programme salie avec des goto partout serait horrible, mais si restreint pour le corps de méthode, il ne semble pas que du mauvais, aussi longtemps que vous suivez une convention (seulement passer à la fin de fonctions, de ne jamais sauvegarder)
- Vous êtes en bonne compagnie. Linus Torvalds a passionnément défendu goto kerneltrap.org/node/553. Sans doute le plus notable de l'omission de Projet de Pièce de monnaie.
- Je suis face à un même problème aussi. Donc je suis en utilisant poursuivre, mais il montre l'erreur qu'une boucle lable: myLable. Ne continuer à travailler uniquement avec des boucles?
- n'essayez pas-enfin faire le travail dans cet exemple?
- try/finally fonctionne bien dans la plupart des cas, et je dirais que c'est suffisant. Le seul inconvénient est que vous ne pouvez pas simplement sauter à la clause finally (facilement). Peut-être que vous pouvez lancer manuellement une exception que vous êtes attraper silencieusement de le faire bien (pas sûr si cela fonctionne mais je ne vois pas pourquoi il ne serait pas).
- au lieu de cela, vous pouvez utiliser une instruction if pour bloquer le reste de votre code. 🙂
- Vous avez besoin d'imaginer un code qui est profondément imbriquée déjà bien.. Comment voulez-vous empêcher quelqu'un d'écrire du code dans le futur et qui est exécuté à l'extérieur que si l'instruction.. dire que vous êtes déjà 3 niveaux de profondeur dans si les déclarations quand vous arrivez à ce point où vous avez besoin pour nettoyer et sortir de la routine.
finally
capte le chemin d'exécution pourbreak
trop, de sorte que vous pouvez passer à la enfin avectry { do { break; } while (false) } finally { }
mais bien sûrfinally
n'est nécessaire que si vous êtesreturn
ing ou attendre une exception ainsi que faire labreak
: si vous n'êtesbreak
ing puisdo{ } while(false)
suffira.- Je ne savais pas que vous pourriez pause d'une instruction try. Nice!
- Vous ne pouvez pas casser à partir d'une instruction try". La pause est de le "faire". Le point est, quand à la fin de l'essai est atteint -- par quelque moyen que ce soit -- enfin à exécuter. Même si vous utilisez un "retour". La définition de enfin, c'est qu'il va exécuter lorsque le contrôle des feuilles de la "essayer". N'importe comment. Donc, si vous avez le code que vous voulez passer, et ne vois pas de moyen simple de les envelopper dans une "si" comme Andres suggère, mettre le try/finally dans sa propre routine, de sorte que vous pouvez utiliser le bouton "retour".
- Bon point, try{}finally{} est probablement une meilleure solution dans la plupart des cas de goto. FWIW, je n'ai jamais utilisé une instruction goto en c ou en toute autre langue qui la prend en charge.
- 3 conditions: Commutateur si le 3 ne diffèrent que de la valeur (cas 1, cas 2, 3). "If / else if / else", pour des maladies plus complexes.
- Vous pouvez utiliser des gotos correctement (si il ya un tel terme) à l'aide de ce bytecode à la modification de la bibliothèque github.com/footloosejava/JavaGoto
- vous faites une supposition erronée. Java depuis que j'ai rememeber a toujours eu le
goto
mot-clé. docs.oracle.com/javase/tutorial/java/nutsandbolts/... . ( Croyez-moi, c'est une très délicate question de la certification. )
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser une étiquette PAUSE déclaration:
Cependant, dans bien conçus code, vous ne devriez pas avoir besoin GOTO fonctionnalité.
didThisErrorHappen
et si oui, afficher l'erreur et le retour, mais ça ne semble pas "bien conçu" pour moi, vraiment. Je préfère suffit d'utiliser goto. Mais les puristes ne semble pas aimer ça, même si utilisé correctement, il est juste une autre façon de structure.Il n'y a pas d'équivalent direct à la
goto
concept en Java. Il y a quelques constructions qui vous permettent de faire certains des choses que vous pouvez faire avec un classiquegoto
.break
etcontinue
états vous permettent de sauter d'un bloc dans une boucle ou d'une instruction switch.break <label>
vous permettent de sauter hors de l'arbitraire d'un composé déclaration à n'importe quel niveau dans une méthode donnée (ou d'initialiseur de bloc).continue <label>
pour continuer avec la prochaine itération d'une boucle externe à partir d'une boucle interne.return
.Aucun de ces Java constructions de vous permettre de direction vers l'arrière ou vers un point dans le code au même niveau d'imbrication que l'instruction en cours. Ils ont tous sauter un ou plus de nidification (champ d'application) les niveaux et ils ont tous (à l'exception de
continue
) sauter vers le bas. Cette restriction permet d'éviter le goto "code spaghetti" syndrome inhérente dans le vieux BASIC, FORTRAN et COBOL2.1 - la partie La plus coûteuse d'exceptions est la création effective de l'objet de l'exception et de ses stacktrace. Si vous avez vraiment, vraiment besoin d'utiliser la gestion des exceptions pour "normal" contrôle de flux, vous pouvez soit préallouer /réutilisation de l'objet de l'exception, ou de créer une classe d'exception personnalisée qui remplace la
fillInStackTrace()
méthode. L'inconvénient est que l'exception duprintStackTrace()
méthodes ne vais pas vous donner de l'information utile ... si vous avez besoin de les appeler.2 - Le code spaghetti syndrome a donné naissance à la la programmation structurée approche, où vous limité dans votre utilisation de la langue disponible constructions. Il pourrait être appliqué à De BASE, Fortran et COBOL, mais il nécessitait des soins et de la discipline. Se débarrasser de
goto
entièrement était un pragmatique meilleure solution. Si vous le gardez dans une langue, il y a toujours un clown qui va en abuser.Juste pour le fun, ici est un GOTO mise en œuvre en Java.
Ai-je besoin d'ajouter "ne l'utilisez pas!"?
Math.random()
peut retourner 0. Il convient de >=Alors que certains commentateurs et downvoters soutiennent que ce n'est pas goto, à la génération de bytecode de la ci-dessous Java états suggère vraiment que ces déclarations vraiment faire exprès goto sémantique.
Plus précisément, le
do {...} while(true);
boucle dans le deuxième exemple est optimisé par les compilateurs Java afin de ne pas évaluer la condition de la boucle.De saut en avant
En bytecode:
Saut en arrière
En bytecode:
// do stuff
et// do more stuff
sont les déclarations d'intérêt,continue label
"a l'effet" de sauter vers l'arrière (en raison de lawhile(true)
déclaration bien sûr). Je ne savais pas que c'était une question précise, mais...while(true)
est traduite par le compilateur dans ungoto
bytecode de l'opération. Commetrue
est une constante littérale, le compilateur peut faire de l'optimisation et de ne pas avoir à évaluer quoi que ce soit. Donc, mon exemple est vraiment un goto, sauter vers l'arrière...goto
états est également à côté de l'essentiel. Le problème avecgoto
et pourquoi il est "considéré comme nuisible" est la façon dont la sémantique est exprimés ... et l'impact qu'il a sur code source lisibilité. (Surtout quandgoto
est abusé.)do
while
, mais alors nous pourrions mettre déclarations juste à l'extérieur il.Si vous voulez vraiment quelque chose, comme les instructions goto, vous pouvez toujours essayer de briser nommée blocs.
Vous devez être dans le champ d'application de la bloquer à la rupture pour l'étiquette:
Je ne vais pas la leçon sur pourquoi vous devriez éviter de goto - je suis en supposant que vous connaissez déjà la réponse à cette question.
StephenC écrit:
Un de plus...
Matt Wolfe écrit:
http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html
La stupide question d'entrevue associés avec enfin est: Si vous revenez d'un try{} bloc, mais de retour dans votre finally{} aussi, dont la valeur est de retour?
return
dans unfinally
bloc est une mauvaise idée. (Et même si la connaissance n'est pas strictement nécessaire, je serais inquiet par un programmeur qui n'a pas eu la curiosité de le découvrir ...)La méthode la plus simple est:
D'essayer le code ci-dessous. Il fonctionne pour moi.
Utiliser une étiquette de briser comme une alternative à goto.
Java n'a pas
goto
, car elle rend le code non structurées et pas clair à lire. Toutefois, vous pouvez utiliserbreak
etcontinue
comme civilisé forme de goto sans ses problèmes.De saut en avant à l'aide de pause -
Sortie:
Saut vers l'arrière à l'aide de poursuivre
Cela entraînera une boucle infinie, comme à chaque fois la ligne
continue before
est exécutée, le flux de code va commencer à nouveau à partir debefore
.