#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 с включенной меткой выходит из оператора, на который указывает метка.
Ссылка должна быть полезной.