В Java нет прямого эквивалента концепции goto
. Есть несколько конструкций, которые позволяют вам делать некоторые вещей, которые вы можете делать с классическим goto
.
- Операторы
break
и continue
позволяют вам выпрыгнуть из блока в операторе цикла или переключателя.
- Помеченный оператор и
break <label>
позволяют вам выпрыгнуть из произвольного составного оператора на любой уровень в рамках данного метода (или блока инициализатора).
- Если вы пометите оператор цикла, вы можете
continue <label>
продолжить следующую итерацию внешнего цикла из внутреннего цикла.
- Бросок и перехват исключений позволяет вам (эффективно) выпрыгивать из многих уровней вызова метода. (Однако исключения относительно дороги и считаются плохим способом сделать «обычный» поток управления 1 .)
- И, конечно, есть
return
.
Ни одна из этих конструкций Java не позволяет вам переходить назад или к точке в коде на том же уровне вложенности, что и текущий оператор. Все они выпрыгивают на один или несколько уровней вложенности (объема), и все они (кроме continue
) прыгают вниз. Это ограничение помогает избежать синдрома goto "код спагетти", присущего старому коду BASIC, FORTRAN и COBOL 2 .
1- Самая дорогая часть исключений - это фактическое создание объекта исключения и его трассировки стека. Если вам действительно нужно использовать обработку исключений для «нормального» управления потоком, вы можете либо предварительно выделить / повторно использовать объект исключения, либо создать собственный класс исключений, который переопределяет метод fillInStackTrace()
. Недостатком является то, что методы printStackTrace()
исключения не дадут вам полезной информации ... если вам когда-нибудь понадобится вызвать их.
2 - Синдром спагетти-кода породил подход структурированного программирования , когда вы ограничивали использование доступных языковых конструкций. Это может быть применено к BASIC , Fortran и COBOL , но это требует осторожности и дисциплины. Полностью избавиться от goto
было прагматически лучшим решением. Если вы держите это на языке, всегда найдется клоун, который будет злоупотреблять этим.