Есть ли в Java оператор goto? - PullRequest
246 голосов
/ 30 марта 2010

Я запутался в этом. Большинству из нас сказали, что в Java нет операторов goto.

Но я обнаружил, что это одно из ключевых слов в Java. Где это можно использовать? Если его нельзя использовать, то почему он был включен в Java в качестве ключевого слова?

Ответы [ 22 ]

8 голосов
/ 26 августа 2009

Поскольку он не поддерживается и зачем вам ключевое слово goto, которое ничего не делает, или переменная с именем goto?

Хотя вы можете использовать операторы break label; и continue label;, чтобы эффективно делать то, что делает goto. Но я бы не советовал.

public static void main(String [] args) {

     boolean t = true;

     first: {
        second: {
           third: {
               System.out.println("Before the break");

               if (t) {
                  break second;
               }

               System.out.println("Not executed");
           }

           System.out.println("Not executed - end of second block");
        }

        System.out.println("End of third block");
     }
}
7 голосов
/ 30 марта 2010

Нет, goto не используется в Java, хотя является зарезервированным словом. То же самое верно для const. Оба они используются в C ++, что, вероятно, является причиной того, что они зарезервированы; Цель заключалась в том, чтобы избежать путаницы в программировании на С ++, мигрирующей на Java, и, возможно, также оставить возможность использовать их в более поздних версиях Java.

2 голосов
/ 26 августа 2009

Обратите внимание, что вы можете заменить большинство случаев использования goto на

  • вернуть

  • перерыв

  • перерыв метка

  • бросить внутрь try-catch-finally

2 голосов
/ 30 марта 2010

Как указывалось, в Java нет goto, но ключевое слово было зарезервировано на случай, если Sun захочет добавить goto в Java однажды. Они хотели иметь возможность добавлять его, не нарушая слишком много кода, поэтому они зарезервировали ключевое слово. Обратите внимание, что в Java 5 они добавили ключевое слово enum, и это также не нарушило код.

Хотя в Java нет goto, у него есть некоторые конструкции, которые соответствуют некоторым применениям goto, а именно возможность break и continue с именованными циклами. Кроме того, finally можно рассматривать как разновидность искаженного goto.

1 голос
/ 26 августа 2009

Запретить объявления переменных с одинаковыми именами.

например. int i = 0, goto;

1 голос
/ 26 августа 2009

См. Следующую ссылку, которая показывает все зарезервированные слова Java и сообщает, какие версии они были добавлены.

http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html

goto зарезервировано, хотя в настоящее время оно не используется, однако никогда не говорите никогда:)

1 голос
/ 02 апреля 2013

http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.goto

Если вам сказали, что в Java нет оператора goto, вас одурачили. Действительно, Java состоит из двух уровней «исходного» кода.

1 голос
/ 30 марта 2010

Это очень часто считается одной из тех вещей, которые вы не делаете, но, вероятно, было указано в качестве зарезервированного слова, чтобы избежать путаницы для разработчиков.

1 голос
/ 20 января 2017

Я тоже не фанат goto, так как это обычно делает код менее читаемым. Однако я считаю, что есть исключения из этого правила (особенно когда речь идет о лексерах и парсерах!)

Конечно, вы всегда можете перенести свою программу в Kleene Normalform, переведя ее в нечто, похожее на ассемблер, а затем написать что-то вроде

int line = 1;
boolean running = true;
while(running)
{
    switch(line++)
    {
        case 1: /* line 1 */
                break;
        case 2: /* line 2 */
                break;
        ...
        case 42: line = 1337; // goto 1337
                break;
        ...
        default: running = false;
                break;
    }
}

(Таким образом, вы в основном пишете виртуальную машину, которая выполняет ваш двоичный код ... где line соответствует указателю инструкции)

Это гораздо более читабельно, чем код, который использует goto, не так ли?

0 голосов
/ 10 августа 2017

Перейти не в Java

Вы должны использовать GOTO Но это не работает правильно. В ключевом Java-слове оно не используется. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html

   public static void main(String[] args) {            
            GOTO me;
            //code;
            me:
            //code; 
            }   
   }
...