Как работает оператор break с меткой?

288
30 января 2017, 17:22

Вот смотрю пример кода и нашел тут вот такое

public static List<Word> detectAllWords(int[][] crossword, String... words) {
    List<Word> wordList = new ArrayList<>();
    int[][] searchDirections = new int[][] {
        {0, 1},
        {1, 1},
        {1, 0},
        {1, -1},
        {0, -1},
        {-1, -1},
        {-1, 0},
        {-1, 1},
    };
    for (String word : words) nextWord:{
        for (int i = 0; i < crossword.length; i++) {
            for (int j = 0; j < crossword[i].length; j++) {
                if (word.charAt(0) == crossword[i][j])
                    for (int directions = 0; directions < searchDirections.length; directions++) {
                        int     tmp_i = i,
                            tmp_j = j,
                            wordPos = 1;
                        while (wordPos < word.length()) {
                            tmp_i += searchDirections[directions][0];
                            tmp_j += searchDirections[directions][1];
                            if (tmp_i < 0 || tmp_i >= crossword.length || tmp_j < 0 || tmp_j >= crossword[tmp_i].length)
                                break;
                            if (word.charAt(wordPos) != crossword[tmp_i][tmp_j])
                                break;
                            else if (wordPos == word.length() - 1) {
                                Word tWord = new Word(word);
                                tWord.setStartPoint(j, i);
                                tWord.setEndPoint(tmp_j, tmp_i);
                                wordList.add(tWord);
                                break nextWord;
                            }
                            wordPos++;
                        }
                    }
            }
        }
    }
    return wordList;
}

Так вот первый раз вижу вот такое условие

for (String word : words) nextWord:{

и потом это как то привязано к строке ниже

break nextWord;

подскажите как это работает или где есть что почитать?

Answer 1

Это оператор break с меткой. В случае его срабатывания происходит переход к коду, который находится за блоком кода с заданной меткой.

Его удобно использовать для выхода из вложенных циклов. Оператор break без метки позволяет перейти только на один уровень вверх, а с помощью break label можно сразу выйти из цикла любой вложенности.

Здесь он используется для выхода из вложенного цикла (из 5-го уровня происходит переход сразу к циклу первого уровня).

Прочитать можно в любом пособии по Java.

Простой пример:

public class Main {
    public static void main(String[] args) {
        label: for (int i=0; i<4; i++)  {
            for (int j=0; j<4; j++) {
                System.out.println("i = " + i + ", j = " + j);
                if (i == 2 && j == 3) {
                    break label;
                }
            }
        }
        System.out.println("End");
    }
}

Вывод на консоль:

i = 0, j = 0
i = 0, j = 1
i = 0, j = 2
i = 0, j = 3
i = 1, j = 0
i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 0
i = 2, j = 1
i = 2, j = 2
i = 2, j = 3
End

PS. break label следует использовать только при крайней необходимости, так как он затрудняет восприятие кода.

READ ALSO
jsp не видит атрибуты

jsp не видит атрибуты

Изучаю Web разработку на java, в качесте источника использую это видео https://wwwyoutube

410
Как отправить письмо с андроида?

Как отправить письмо с андроида?

Мне нужно отправить письмо на почту с андроида, без сторонних приложений

370
Как собрать проект Jsf?

Как собрать проект Jsf?

Всем приветРебят создал web-проект на Jsf(Primefaces),HIbernate

316
ActionBar (item) занимает много места

ActionBar (item) занимает много места

Как уменьшить размер item'а чтобы его размер был ограничен его содержанием?

357