Разрыв от другого класса возможен? - PullRequest
0 голосов
/ 14 октября 2011

Я недавно заново открыл использование взлома метки.Теперь мне интересно, можно ли вернуться к метке из другого класса.

Пример того, что я хочу:

Main.class

label:
for (Product p : ProductList) {
 if (p.getSet() == true) {
  classHandler();
 }
}

Classhandler.class

someFunction() {
 break label;
}

Когда я набирал это, я действительно пытался создать локальную функцию в своем классе Main (поэтому я мог просто вызвать эту функцию вместо этого), но даже там я получил ошибку undefined label: label.

Ответы [ 4 ]

5 голосов
/ 14 октября 2011

Нет, вы не можете. И ты не должен.

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

В противном случае вы должны сделать что-то вроде возврата флага, который указывает, должны ли обрабатываться другие продукты, и реагирования на это в вашем цикле.

Как вы заметили, вы не можете даже break пройти через границы метода, и это хорошо . break и continue являются мощными инструментами, но могут легко сделать ваш код запутанным, если его использовать неправильно. Например, break, скрытый внутри огромного блока кода, может быть легко пропущен, но если вы используете continue в самом верху метода, чтобы пропустить итерацию, основанную на каком-то условии, тогда цель довольно ясна. 1016 *

1 голос
/ 14 октября 2011

Метка, на которую вы ломаетесь, должна находиться в области видимости.Из документации java sun:

Оператор break с меткой Identifier пытается перенести управление во вложенную помеченную инструкцию (§14.7), которая имеет тот же идентификатор, что и его метка;это утверждение, которое называется целью разрыва, затем сразу же завершается нормально.В этом случае целью break не обязательно должен быть оператор while, do, for или switch.Оператор прерывания должен ссылаться на метку внутри непосредственно включающего метода или блока инициализатора. Нелокальных переходов нет

0 голосов
/ 14 октября 2011

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

0 голосов
/ 14 октября 2011

Нет, вы не можете.Это даже не работает между двумя методами одного и того же класса.Ярлыки ограничены (не более) одним способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...