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

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

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

Ответы [ 22 ]

216 голосов
/ 28 декабря 2010

Джеймс Гослинг создал оригинальную JVM с поддержкой операторов goto, но затем удалил эту функцию как ненужную. Основная причина goto в том, что она не нужна, состоит в том, что обычно ее можно заменить более читаемыми выражениями (например, break/continue) или выделив часть кода в метод.

Источник: Джеймс Гослинг, сессия вопросов и ответов

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

В списке ключевых слов Java указано ключевое слово goto, но оно помечено как "не используется".

Это было в оригинальной JVM (см. ответ @ VitaliiFedorenko ), но затем удалено. Вероятно, оно оставалось в качестве зарезервированного ключевого слова на случай его добавления в более позднюю версию Java.

Если бы goto не было в списке, и оно будет добавлено к языку позже, существующий код, который использовал слово goto в качестве идентификатора (имя переменной, имя метода и т. Д.), Сломался бы. Но поскольку goto является ключевым словом, такой код даже не будет компилироваться в настоящее время, и остается возможность заставить его действительно что-то делать позже, не нарушая существующий код.

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

Ключевое слово существует, но оно не реализовано.

Единственная веская причина использовать goto, о которой я могу подумать, это:

for (int i = 0; i < MAX_I; i++) {
    for (int j = 0; j < MAX_J; j++) {
        // do stuff
        goto outsideloops; // to break out of both loops
    }
}
outsideloops:

В Java вы можете сделать это следующим образом:

loops:
for (int i = 0; i < MAX_I; i++) {
    for (int j = 0; j < MAX_J; j++) {
        // do stuff
        break loops;
    }
}
43 голосов
/ 30 марта 2010

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

"Ключевые слова const и goto защищены, даже если они не в настоящее время используется. «

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

Так что их можно использовать однажды, если языковые дизайнеры почувствуют необходимость.

Кроме того, если программисты из языков, которые имеют эти ключевые слова (например, C, C ++), используют их по ошибке, компилятор Java может выдать полезное сообщение об ошибке.

Или, может быть, это просто остановило программистов, использующих goto:)

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

Они зарезервированы для будущего использования (см .: Ключевые слова на языке Java )

Ключевые слова const и goto зарезервированы, хотя в настоящее время они не используются.

Причину , почему в Java нет оператора goto, можно найти в " Языковая среда Java ":

У Java нет оператора goto. Исследования показали, что goto (неправильно) используется чаще, чем просто «потому что оно есть». Исключение goto привело к упрощению языка - например, нет никаких правил о влиянии goto на середину оператора for. Исследования примерно 100 000 строк кода на C показали, что примерно 90 процентов операторов goto были использованы исключительно для получения эффекта разрыва вложенных циклов. Как уже упоминалось выше, многоуровневый разрыв и продолжение устраняют большую часть необходимости в операторах goto.

17 голосов
/ 11 апреля 2013

Пример использования меток «продолжить» в Java:

public class Label {
    public static void main(String[] args) {
        int temp = 0;
        out: // label
        for (int i = 0; i < 3; ++i) {
            System.out.println("I am here");
            for (int j = 0; j < 20; ++j) {
                if(temp==0) {
                    System.out.println("j: " + j);
                    if (j == 1) {
                        temp = j;
                        continue out; // goto label "out"
                    }
                }
            }
        }
        System.out.println("temp = " + temp);
    }
}

Результаты:

I am here // i=0
j: 0
j: 1
I am here // i=1
I am here // i=2
temp = 1
10 голосов
/ 14 июня 2012

Важно понимать, что конструкция goto является пережитком тех дней, когда программисты программировали на машинном коде и ассемблере. Поскольку эти языки настолько базовы (как, например, каждая инструкция выполняет только одну вещь), процесс управления программой полностью выполняется с помощью операторов goto (но на языке ассемблера они называются jump или ответвление инструкции).

Теперь, хотя язык C является довольно низкоуровневым, его можно рассматривать как язык ассемблера очень высокого уровня - каждое утверждение и функция в C легко могут быть разбиты на инструкции на языке ассемблера. Хотя C сегодня не является основным языком программирования компьютеров, он все еще широко используется в приложениях низкого уровня, таких как встроенные системы. Поскольку функция C настолько близко отражает функцию языка ассемблера, имеет смысл только то, что goto включено в C.

Понятно, что Java - это эволюция C / C ++. Java имеет много функций из C, но абстрагирует намного больше деталей, и поэтому просто написано по-другому. Java - это язык очень высокого уровня, поэтому просто не нужно иметь низкоуровневые функции, такие как goto, когда более высокоуровневые конструкции, такие как функции for, для каждого и в то время как циклы выполняют поток управления программой. Представьте, что вы были в одной функции и сделали метку goto для другой функции. Что произойдет, когда другая функция вернется? Эта идея абсурдна.

Это не обязательно отвечает, почему Java включает в себя оператор goto, но не позволяет его компилировать, но важно знать, почему goto вообще когда-либо использовался, в приложениях более низкого уровня, и почему просто не имеет смысла использовать его в Java.

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

Нет, goto не используется, но вы можете определить метки и оставить цикл до метки. Вы можете использовать break или continue с меткой. Таким образом, вы можете выпрыгнуть более чем на один уровень цикла. Взгляните на учебник .

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

Нет, к счастью, в Java нет goto.

Ключевое слово goto зарезервировано, но не используется (то же самое относится и к const).

...