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

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

Извините, fragment кода удален. Я разделяю вопрос

JLS 14.7 Обозначенные заявления

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

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

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

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

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


Вот иллюстративный пример: с учетом int[] мы хотим:

  • print "One (1)" на 1
  • print "Two (2)" на 2
  • напечатать "Zero " на 0
  • немедленно прекратить обработку на любом другом номере

     int[] arr = { 1, 2, 0, 1, -1, 0, 2 }; loop: for (int num : arr) { switch (num) { case 1: System.out.print("One "); break; case 2: System.out.print("Two "); break; case 0: System.out.print("Zero "); continue loop; default: break loop; } System.out.print("(" + num + ") "); } // prints "One (1) Two (2) Zero One (1) " 

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

  • Различные числа обрабатываются в switch
  • Немаркированный break в switch используется, чтобы избежать «падения» между случаями
  • Маркированный continue loop; используется для пропуска пост-обработки на case 0: (метка здесь не нужна)
  • Маркированный break loop; используется для завершения цикла по default: (здесь требуется метка, иначе это switch break )

Таким образом, помеченный break / continue также может использоваться вне вложенных циклов; его можно использовать, когда switch вложен внутри цикла. В более общем плане, он используется, когда есть потенциально множественная цель break / continue , и вы хотите выбрать тот, который не сразу включает оператор break / 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 URL. К сожалению, головоломка не идет на «правильное» использование помеченных выражений более подробно.

Да, 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"); 

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

 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; } } } 
Interesting Posts

Как добавить полосу прокрутки в таблицу HTML5?

Crystal Reports в ASP.NET MVC

Chrome localhost cookie не установлен

Fedora Autologin в runlvel 3 и приложение Autostart

Установить диапазон для элементов в GridLayoutManager с помощью SpanSizeLookup

В чем разница между «локальными» и «роуминговыми» папками?

Что быстрее: распределение стека или выделение кучи

Как использовать тему по умолчанию для приложения?

Как оценить выражение инфикса только одним сканом с помощью стеков?

Заполнение таблицы с использованием базы данных в JavaFX

Как отформатировать / восстановить USB-накопитель с защитой от записи с ошибками ввода-вывода?

Почему 64-разрядная ОС не может работать с 16-разрядным приложением?

Windows Disk I / O 100% при загрузке в течение 20 минут

Как я могу автоматически выходить из системы с компьютера Windows?

Как заменить часть текстового файла между маркерами на другой текстовый файл?

Давайте будем гением компьютера.