#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. очевидно, что это упрощенный пример