it-swarm.com.de

So verwenden Sie die goto-Anweisung richtig

Ich nehme meinen Highschool AP Computer Science-Kurs. 

Ich entschied mich, eine goto-Anweisung in eines unserer Labore zu werfen, nur um herumzuspielen, aber ich habe diesen Fehler erhalten. 

Exception in thread "main" Java.lang.Error: Unresolved compilation problems: 
    Syntax error on token "goto", assert expected
    restart cannot be resolved to a variable
at Chapter_3.Lab03_Chapter3.Factorial.main(Factorial.Java:28)

Ich ging zu einer goto-Frage in Stackoverflow, um herauszufinden, wie man es richtig macht, und ich tat genau so, wie es in einer der Antworten gezeigt wurde. Ich verstehe wirklich nicht, warum der Compiler eine assert-Anweisung will (zumindest ist es das, was ich vermute, dass er will), und ich habe keine Ahnung, wie man assert verwendet. Der Neustartteil von goto restart; scheint eine Variable zu sein, aber Neustart ist nur eine Bezeichnung, die das Programm in Zeile 10 zurückzieht, sodass der Benutzer eine gültige int eingeben kann. Wenn Neustart eine Variable sein soll, wie mache ich das?

import Java.util.*;

public class Factorial 
{
    public static void main(String[] args) 
    {
        int x = 1;
        int factValue = 1;
        Scanner userInput = new Scanner(System.in);
        restart:
        System.out.println("Please enter a nonzero, nonnegative value to be factorialized.");
        int factInput = userInput.nextInt();

        while(factInput<=0)
        {
            System.out.println("Enter a nonzero, nonnegative value to be factorialized.");
            factInput = userInput.nextInt();
        }

        if(x<1)//This is another way of doing what the above while loop does, I just wanted to have some fun.
        {
            System.out.println("The number you entered is not valid. Please try again.");
            goto restart;
        }
        while(x<=factInput)
        {
            factValue*=x;
            x++;
        }
        System.out.println(factInput+"! = "+factValue);
        userInput.close();
    }
}
26
Ungeheuer

Wie bereits in allen Antworten hervorgehoben, goto - ein reserviertes Wort in Java und wird in der Sprache nicht verwendet.

restart: wird als Bezeichner gefolgt von einem Doppelpunkt bezeichnet.

Hier sind einige Dinge, die Sie beachten sollten, wenn Sie similar-Verhalten erzielen möchten. 

outer:                  // Should be placed exactly before the loop
loopingConstructOne  {  // We can have statements before the outer but not inbetween the label and the loop          
    inner:
    loopingConstructTwo {
        continue;       // This goes to the top of loopingConstructTwo and continue.
        break;          // This breaks out of loopingConstructTwo.
        continue outer; // This goes to the outer label and reenters loopingConstructOne.
        break outer;    // This breaks out of the loopingConstructOne.
        continue inner; // This will behave similar to continue.
        break inner;    // This will behave similar to break.
    }
}

Ich bin nicht sicher, ob ich similar sagen sollte, wie ich es bereits getan habe.

65
Tirath

Die Java-Schlüsselwortliste gibt das goto-Schlüsselwort an, es wird jedoch als "nicht verwendet" markiert.

Dies wurde wahrscheinlich für den Fall getan, dass es zu einer späteren Version von Java hinzugefügt werden sollte.

Wenn goto nicht in der Liste enthalten war und der Sprache später hinzugefügt wurde, würde der vorhandene Code, der das Word-goto als Bezeichner (Variablenname, Methodenname usw.) verwendet, beschädigt werden. Da es sich bei goto jedoch um ein Schlüsselwort handelt, kann ein solcher Code in der Gegenwart nicht einmal kompiliert werden, und es bleibt möglich, dass er später etwas tut, ohne den vorhandenen Code zu beschädigen.

12
Aditya Singh

Wenn Sie nachschlagen und fortfahren, akzeptieren Sie ein "Label". Experimentieren Sie damit. Goto selbst funktioniert nicht.

public class BreakContinueWithLabel {

    public static void main(String args[]) {

        int[] numbers= new int[]{100,18,21,30};

        //Outer loop checks if number is multiple of 2
        OUTER:  //outer label
        for(int i = 0; i<numbers.length; i++){
            if(i % 2 == 0){
                System.out.println("Odd number: " + i +
                                   ", continue from OUTER label");
                continue OUTER;
            }

            INNER:
            for(int j = 0; j<numbers.length; j++){
                System.out.println("Even number: " + i +
                                   ", break  from INNER label");
                break INNER;
            }
        }      
    }
}

Weiterlesen

10
Bill K

Java unterstützt goto nicht. Es ist als Schlüsselwort reserviert, falls es einer späteren Version hinzugefügt werden soll

3
Daniel Cardoso

goto macht nichts in Java.

3
Sizik

Java verwendet auch keine Zeilennummern, was für eine GOTO-Funktion erforderlich ist. Im Gegensatz zu C/C++ hat Java keine goto-Anweisung, aber Java unterstützt label. Die einzige Stelle, an der ein Label in Java nützlich ist, befindet sich direkt vor verschachtelten Schleifenanweisungen. Wir können einen Labelnamen mit break angeben, um eine bestimmte äußere Schleife auszubrechen.

2
user6224849

Es gibt kein "goto" in der Java-Welt. Der Hauptgrund dafür war, dass die Entwickler erkannten, dass komplexe Codes, die bereits gemacht wurden, dazu führen würden, dass der Code wirklich erbärmlich wird, und dass es fast unmöglich wäre, den Code zu verbessern oder zu verwalten. 

Dieser Code kann jedoch ein wenig geändert werden. Mit dem Konzept von continue und break können wir den Code funktionieren lassen.

    import Java.util.*;

public class Factorial 
{
    public static void main(String[] args) 
    {
        int x = 1;
        int factValue = 1;
        Scanner userInput = new Scanner(System.in);
        restart: while(true){
        System.out.println("Please enter a nonzero, nonnegative value to be factorialized.");
        int factInput = userInput.nextInt();

        while(factInput<=0)
        {
            System.out.println("Enter a nonzero, nonnegative value to be factorialized.");
            factInput = userInput.nextInt();
        }

        if(x<1)//This is another way of doing what the above while loop does, I just wanted to have some fun.
        {
            System.out.println("The number you entered is not valid. Please try again.");
            continue restart;
        }
        while(x<=factInput)
        {
            factValue*=x;
            x++;
        }
        System.out.println(factInput+"! = "+factValue);
        userInput.close();
        break restart;
}
    }
}
0
Sohail Sankanur

goto ist ein nicht verwendetes reserviertes Wort in der Sprache. Es gibt also keine goto. Aber wenn Sie absurdistisches Theater wollen, könnten Sie eines aus einer sprachlichen Funktion der Kennzeichnung herausholen. Anstatt eine for-Schleife zu kennzeichnen, was manchmal nützlich ist, kennzeichnen Sie einen Codeblock. Innerhalb dieses Codeblocks können Sie auf dem Etikett break break aufrufen und Sie bis zum Ende des Codeblocks spucken, der im Grunde ein goto ist und nur im Code vorwärts springt.

    System.out.println("1");
    System.out.println("2");
    System.out.println("3");
    my_goto:
    {
        System.out.println("4");
        System.out.println("5");
        if (true) break my_goto;
        System.out.println("6");
    } //goto end location.
    System.out.println("7");
    System.out.println("8");

Dadurch werden 1, 2, 3, 4, 5, 7, 8 gedruckt. Beim Brechen sprang der Codeblock unmittelbar nach dem Codeblock an. Sie können die Anweisungen my_goto: { und if (true) break my_goto; und } //goto end location. verschieben. Wichtig ist nur, dass die Unterbrechung innerhalb des gekennzeichneten Codeblocks sein muss.

Das ist noch hässlicher als ein echter Spruch. Mach das nie wirklich.

Manchmal ist es jedoch nützlich, Labels und Break zu verwenden. Wenn Sie also den Codeblock und nicht die Schleife beim Break kennzeichnen, springen Sie vorwärts. Wenn Sie also den Codeblock innerhalb der Schleife aufbrechen, brechen Sie die Schleife nicht nur ab, sondern springen zwischen dem Ende der Schleife und dem Codeblock.

0
Tatarize