Пожалуйста, объясните использование помеченных заявлений

  • Разбивает и продолжает использовать только помеченные операторы в Java?
  • Когда вы использовали помеченные операторы в своих программах?

Извините за код фрагмент был удален. Я делю вопрос

8
задан unj2 25 April 2010 в 23:55
поделиться

3 ответа

JLS 14.7 Помеченные операторы

(отредактировано для ясности)

Операторы могут иметь префиксы меток ( Идентификатор : Оператор ). Идентификатор объявляется меткой непосредственно содержащегося утверждения .

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

Таким образом, в JLS ясно, что метки используются с break или continue , и никакой другой грамматический элемент языка программирования Java не использует их.

Строго говоря, break и continue , отмеченные или нет, НИКОГДА не являются необходимыми. Их всегда можно написать вне кода. Однако при идиоматическом использовании они могут привести к более удобочитаемому коду.


Вот наглядный пример: имея int [] , мы хотим:

  • print «One (1)» на 1
  • print «Два (2)» на 2
  • print «Ноль» на 0
  • немедленно прекратить обработку любого другого номера

     int [] arr = {1, 2, 0, 1, -1, 0, 2}; 
    цикл: 
    for (int num: arr) {
    switch (num) {{ {1}} случай 1: 
    System.out.print ("One"); 
    break; 
    случай 2: 
    System.out.print (" Два "); 
    break; 
    case 0: 
    System.out.print (" Zero "); 
    continue loop; 
    default: 
    цикл прерывания; 
    } 
    System.out.print ("(" + num + ")"); 
    } 
     // выводит "Один (1) Два (2) Ноль Один (1)" 
     

Здесь мы видим, что:

  • Различные числа обрабатываются в переключателе
  • Немаркированный разрыв в переключателе используется, чтобы избежать «провала» между случаями
  • Цикл продолжения с меткой ; используется для пропуска постобработки в случае 0: (метка здесь не требуется)
  • Цикл с меткой разрыва; используется для завершения цикла на по умолчанию: (метка здесь необходима; в противном случае это разрыв переключателя )

Так помечено break / continue также можно использовать вне вложенных циклов; его можно использовать, когда переключатель вложен в цикл. В более общем смысле, он используется, когда есть потенциально несколько целевых break / continue , и вы хотите выбрать тот, который не включает сразу разрыв / оператор continue .


Вот еще один пример:

    morningRoutine: {
        phase1: eatBreakfast();
        if (grumpy) break morningRoutine;
        phase2: kissWife();
        phase3: hugChildren();
    }
    http://stackoverflow.com is the best website ever!

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

И нет, последняя строка НЕ ​​дает ошибки времени компиляции. На самом деле он вдохновлен Java Puzzlers Puzzle 22: Dupe of URL. К сожалению, загадка не заключается в более глубоком «правильном» использовании помеченных утверждений.

17
ответ дан 5 December 2019 в 06:22
поделиться

Да, break и continue - единственные два варианта использования помеченных операторов в Java . (В Java нет оператора goto .)

Вы можете использовать метку для выхода из вложенных циклов.

outer:
    for (int i = 0; i < 5; i++) {    
        for (int j = 0; j < 5; j++) {
            System.out.println("Hello");
            continue outer;
        } // end of inner loop
        System.out.println("outer"); // Never prints
    }
System.out.println("Good-Bye");

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

6
ответ дан 5 December 2019 в 06:22
поделиться
search:
    for (i = 0; i < arrayOfInts.length; i++) {
        for (j = 0; j < arrayOfInts[i].length; j++) {
            if (arrayOfInts[i][j] == searchfor) {
                foundIt = true;
                break search;
            }
        }
    }
3
ответ дан 5 December 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: