83 votes

Alternative à une instruction goto en Java

Ce qui est une autre fonction pour le goto mot-clé dans Java?

Depuis Java ne dispose pas d'un goto.

82voto

Padmarag Points 3489

Vous pouvez utiliser une étiquette PAUSE déclaration:

search:
    for (i = 0; i < arrayOfInts.length; i++) {
        for (j = 0; j < arrayOfInts[i].length; j++) {
            if (arrayOfInts[i][j] == searchfor) {
                foundIt = true;
                break search;
            }
        }
    }

Cependant, dans bien conçus code, vous ne devriez pas avoir besoin GOTO fonctionnalité.

42voto

Stephen C Points 255558

Il n'y a pas d'équivalent direct de l' goto concept en Java. Il y a quelques constructions qui vous permettent de faire certaines des choses que vous pouvez faire avec un classique de la goto.

  • L' break et continue états vous permettent de sauter d'un bloc dans une boucle ou d'une instruction switch.
  • Un rapport marqué et 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).
  • Si vous identifiez une boucle de compte, vous pouvez en continue <label> continuer avec la prochaine itération d'une boucle externe à partir d'une boucle interne.
  • Lancer et attraper les exceptions permet d' (efficace) de sauter de nombreux niveaux d'un appel de méthode. (Toutefois, des exceptions sont relativement coûteux et sont considérés comme d'être une mauvaise façon de le faire "ordinaire" flux de contrôle1.)
  • Et bien sûr, il y a 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 (à part 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 l' fillInStackTrace() méthode. L'inconvénient est que l'exception de l' printStackTrace() 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 programmation structurée , où vous limité dans votre utilisation de la langue disponible constructions. Il pourrait être appliqué à BASIC, Fortran et COBOL, mais il nécessitait des soins et de la discipline. Se débarrasser de l' 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.

30voto

Pascal Thivent Points 295221

Juste pour le plaisir, ici, est un GOTO mise en œuvre en Java.

Exemple:

   1 public class GotoDemo {
   2     public static void main(String[] args) {
   3         int i = 3;
   4         System.out.println(i);
   5         i = i - 1;
   6         if (i >= 0) {
   7             GotoFactory.getSharedInstance().getGoto().go(4);
   8         }
   9         
  10         try {
  11             System.out.print("Hell");
  12             if (Math.random() > 0) throw new Exception();            
  13             System.out.println("World!");
  14         } catch (Exception e) {
  15             System.out.print("o ");
  16             GotoFactory.getSharedInstance().getGoto().go(13);
  17         }
  18     }
  19 }

L'exécutant:

$ java -cp bin:asm-3.1.jar GotoClassLoader GotoDemo           
   3
   2
   1
   0
   Hello World!

Ai-je besoin d'ajouter "ne l'utilisez pas!"?

17voto

Lukas Eder Points 48046

Alors que certains commentateurs et downvoters soutiennent que ce n'est pas de goto, le bytecode généré à partir du dessous de Java états suggère vraiment que ces déclarations vraiment faire exprès goto sémantique.

Plus précisément, l' 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.

Saut en avant

label: {
  // do stuff
  if (check) break label;
  // do more stuff
}

En bytecode:

2  iload_1 [check]
3  ifeq 6          // Jumping forward
6  ..

Saut en arrière

label: do {
  // do stuff
  if (check) continue label;
  // do more stuff
  break label;
} while(true);

En bytecode:

 2  iload_1 [check]
 3  ifeq 9
 6  goto 2          // Jumping backward
 9  ..

De ne pas être utilisé dans n'importe quelle pièce de logiciel ;-)

5voto

Amir Afghani Points 17519

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:

namedBlock: {
  if (j==2) {
    // this will take you to the label above
    break namedBlock;
  }
}

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X