Как следующий код библиотеки Java может выйти из цикла while (true)? - PullRequest
1 голос
/ 27 апреля 2011

Я просматривал код Java TimSort: Исходный код , в частности строки с 676 по 739 функции mergeLo.Он имеет (примерно) следующую компоновку:

outer:
    while (true) {
        //Code here
        break outer; //Code within a few if tests in the loop.
    }
    //Code here executes somehow.

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

Моя проблема в том, что строка 747 выполняет и выдает исключение, когда я пытаюсь отсортировать 184 или более элементов, и я хочу выяснить, как это исправить,любая помощь будет принята с благодарностью.

[Примечание]: эта функция вызывается методом collection.sort для Java, развернутой на телефоне Android.

Ответы [ 4 ]

7 голосов
/ 27 апреля 2011

Метка 'external' является просто псевдонимом цикла while. То есть оператор break разрывает цикл, а поток управления продолжается после цикла.

Напротив, continue external вернется к началу цикла while.

1 голос
/ 27 апреля 2011

outer на самом деле помечает цикл while, а не строку перед ним, поэтому он не будет повторно вводиться после разрыва ... это не goto. =)

0 голосов
/ 27 апреля 2011

вы должны посмотреть на синтаксис операторов break .

Я думаю, что вы думаете о break утверждении как goto утверждении. Это две разные вещи. Оператор break со включенной меткой разрывает оператор, на который указывает метка.

Ссылка должна быть полезной.

0 голосов
/ 27 апреля 2011

break outer; заставляет вас выйти из цикла while(true).Это не попадет в петлю.Вы путаете break с continue?

...