Есть ли инструкция goto в Java?

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

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

Ответ 1

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

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

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

Ответ 2

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

Источник: Джеймс Гослинг, Q & сеанс

Ответ 3

Чтобы люди не погибли от велоцирапторов.

goto.png

Ответ 4

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

Единственная веская причина использовать 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;
    }
}

Ответ 6

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

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

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

Ответ 7

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

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

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

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

Ответ 8

Пример использования меток "continue" в 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

Ответ 9

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

Ответ 10

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

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

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

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

Ответ 11

Java имеет GOTO на уровне байт-кода как goto и goto_w. Однако на языке Java отсутствует GOTO.

Хотя Java запрещает GOTO, Microsoft решила сохранить его в арсенале .NET. С# позволяет GOTO:

goto (ссылка на С#)

Оператор goto передает управление программой непосредственно на помеченную выражение. Общее использование goto заключается в передаче управления конкретному метку коммутатора или метку по умолчанию в инструкции переключателя. Переход оператор также полезен для выхода из глубоко вложенных циклов.

Учитывая, что С# (главный конкурент Java в .NET) позволяет GOTO, я не понимаю, почему это было бы так дорого, если бы у Java тоже было это.

Существуют обходные пути, такие как этот проект:

JavaGoto

Это пригодится при преобразовании устаревшего кода. Например, некоторый старый код Fortran настолько запутан, что сохранение целостности GOTO может быть наиболее эффективным решением перед переносом кода в соответствующие конструкции.

Допуск Goto в С# не привел к злоупотреблению GOTO, и я сомневаюсь, что Java будет хуже, если бы они тоже допустили это.

Ответ 12

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

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

Ответ 13

Потому что он не поддерживается и почему вы хотите, чтобы ключевое слово 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");
     }
}

Ответ 14

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

Ответ 15

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

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

Ответ 16

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

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

Ответ 17

См. следующую ссылку: отображает все зарезервированные слова java и сообщает, какие версии они добавили.

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

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

Ответ 18

Обратите внимание, что вы можете заменить большинство доброкачественных применений goto на

  • возвращение

  • разрыва

  • Разбить ярлык

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

Ответ 19

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

Ответ 21

Я тоже не поклонник 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, не так ли?

Ответ 22

Потому что, хотя язык Java не использует его, байт-код JVM делает.

Ответ 23

Конечно, это ключевое слово, но оно не используется на уровне исходного кода.

Но если вы используете jasmin или другой язык нижнего уровня, который преобразуется в байт-код, тогда "goto" есть

Ответ 24

goto не находится в Java

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

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