метка прямого разрыва

#java

#java

Вопрос:

Как я могу выполнять подобные переходы вперед?? Eclipse жалуется, что label1 не найден…

Спасибо

 public class foo {

    int xyz() {
        int b = 1;

        if (b == 0) {
            break label1;
        }

        // MORE CODE HERE

        label1:

            return 1;

    }
}
  

Комментарии:

1. Eclipse жалуется, потому что имя блока не было определено в том месте кода, откуда вы вызываете его. Это выходит за рамки.

Ответ №1:

Вы пытаетесь использовать эквивалент goto в Java. Вы не можете, и на то есть веская причина. Покинуть корабль.

Метки включены в Java с единственной целью — выбрать, из какого цикла или переключателя выходить, в случае вложенных циклов (или операторов switch). У них нет другого назначения, и даже это единственное назначение часто считается опасно близким к goto.

Комментарии:

1. На самом деле JVM поддерживает goto. Вы могли бы использовать библиотеку, подобную BCEL, чтобы делать что угодно с байт-кодом.

2. @Saideira: Java — это не то же самое, что JVM. Goto не поддерживается в языке программирования Java. Это зарезервированное ключевое слово, которое запрещено использовать.

Ответ №2:

Метки применимы только к циклам (и блокам в целом). И вы пытаетесь имитировать goto . Не делайте этого.

Комментарии:

1. На самом деле метки применяются к блокам.

2. @Clint да .. но об этом не следует говорить вслух 🙂 или следующее, что вы увидите, это люди, выходящие из блоков

3. @Clint — На самом деле, метки применяются к операторам , по крайней мере, в соответствии со спецификацией языка Java .

Ответ №3:

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

 public class foo {

    int xyz() {
        int b = 1;
        boolean skip = false;

        if (b == 0) {
            skip = true;
        }

        if (!skip) {
            // MORE CODE HERE
        }
        return 1;
    }
}
  

Комментарии:

1. включение разрыва в цикл do / while также не помогает .. все еще жалуюсь на «отсутствующую» метку

2. Я тоже не фанат флаговых переменных :-). Пример OP является надуманным, но лучше всего было бы разобраться с использованием a return в if самом блоке или с использованием блока else для MORE CODE HERE .

3. @Saideira — для break label1; работы label1 должна быть метка инструкции, содержащей break .

Ответ №4:

Я добавляю к предыдущим ответам, почему бы просто

 if (b == 0) {
 return 1;
}
  

?

Комментарии:

1. очевидно, что это упрощенный пример