Как перейти от одного цикла к другому для цикла с помощью метки в Java? - PullRequest
0 голосов
/ 19 октября 2018

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

public class Test {
   public static void main(String...rDX) {
      runing:
      for (int i = 1; i < 10; i++)
         System.out.print(i);
      for(int i = 1; i < 10; i++) {
         if (i == 5) {
            continue runing;
         }
      }
   }
}

ошибка: Java: 28: ошибка: неопределенная метка: работа продолжается работа;^ 1 ошибка

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

Как уже говорил LuCio, проблема в том, что второй цикл не является частью первого цикла.

Если вы вложите в свой пример циклы for, это будет работать:

public static void main(String[] args) {
    runing:
    for (int i = 1; i < 10; i++) {
        System.out.print(i);
        for (int j = 1; j < 10; i++) {
            if (j == 5) {
                continue runing;
            }
        }
    }
}

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

0 голосов
/ 19 октября 2018

Вы не можете сделать это, потому что вы можете прервать только цепочку вложенных for s и продолжить на некотором внешнем / родительском for.Вы не можете продолжать с другими for, которые оказываются просто рядом.Но вы могли бы использовать это, например, для

public class Test {
    public static void main(String...rDX) {
        runing: for (;;) { // infinite loop
            for (int i = 1; i < 10; i++)
                System.out.print(i);
            for(int i = 1; i < 10; i++) {
                if (i == 5) {
                    continue runing;
                }
            }
            break; // = break runing; effectively never reached
                   // because above "continue" will always happen
        }
    }
}

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

(?) = По крайней мере, что он будет делать, когда он скомпилируется - я сомневаюсь, что вы действительно этого хотите, потому что вы все равно напечатаете 1..10, затем на следующем шаге незаметно сосчитаете до 5 и ничего не делаетес этим номером.

0 голосов
/ 19 октября 2018

JLS говорит:

Идентификатор объявляется как метка немедленно содержащегося оператора.... В отличие от C и C ++, язык программирования Java не имеет оператора goto;метки операторов идентификаторов используются с break или continue операторами ..., появляющимися в любом месте внутри помеченного оператора.

Область действия метки помеченного оператора - это непосредственно содержащийся оператор.

В вашем случае петля for сразу за этикеткой runing не упоминает этикетку.Второй цикл for пытается перейти к метке.Но он не является частью первого цикла for, поэтому сразу следует следующее утверждение.

Это приводит к ошибке времени компиляции.

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

...