Как следующий код библиотеки Java мог когда-либо выйти из цикла while (true)?

#java #logic #while-loop

#java #Логические #цикл while

Вопрос:

Я просматривал 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 отправляются во внешний блок (который затем должен вернуться в while (true) ), и нет инструкций return .

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

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

Ответ №1:

Метка ‘outer’ — это просто псевдоним для цикла while . То есть оператор break прерывает цикл, и поток управления продолжается после цикла.

Напротив, continue outer вернет начало цикла while.

Ответ №2:

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

Ответ №3:

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

Ответ №4:

вам следует взглянуть на синтаксис break инструкций.

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

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