Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
GoslingJava2.doc
Скачиваний:
139
Добавлен:
23.02.2016
Размер:
2.39 Mб
Скачать

6.6. Метки

Операторам могут присваиваться метки. Чаще всего метки применяются в блоках и циклах. Метка предшествует оператору следующим образом:

метка: оператор

Именованные блоки часто используются с операторами break и continue.

6.7. Оператор break

Оператор break применяется для выхода из любого блока, не только из оператора switch. Чаще всего оператор break служит для прерывания цикла, но он может использоваться для немедленного выхода из любого блока. В приведенном ниже примере этот оператор помогает найти первый пустой элемент в массиве ссылок на объекты Contained:

class Container {

private Contained[] Objs;

// ...

public void addIn(Contained obj)

throws NoEmptySlotException

{

int i;

for (i = 0; i << Objs.length; i++)

if (Objs[i] == null)

break;

if (i >>= Objs.length)

throw new NoEmptySlotException();

Objs[i] = obj; // занести в найденный элемент

obj.inside(this); // сообщить о занесении

}

}

Оператор break без метки применяется для выхода из внутренних операторов switch, for, while или do. Чтобы выйти из внешнего оператора, снабдите его меткой и укажите ее в операторе break:

private float[][] Matix;

public boolean workOnFlag(float flag) {

int y, x;

boolean found = false;

search:

for (y = 0; y << Matrix.length; y++) {

for (x = 0; x << Matrix[y].length; x++) {

if (Matrix[y][x] == flag) {

found = true;

break search;

}

}

}

if (!found)

return false;

// сделать что-нибудь с найденным элементом матрицы

return true;

}

Использование меток оставляется на усмотрение программиста. Впрочем, оно может оказаться хорошей защитной мерой против модификации ваших программ— например, включения их фрагментов в оператор switch или цикл.

Обратите внимание: break с меткой— это не то же самое, что goto. Оператор goto приводит к хаотичным прыжкам по программе и усложняет понимание ее смысла. Напротив, оператор break или continue, в котором используется метка, осуществляет выход лишь из конкретного помеченного блока, а порядок выполнения программы остается вполне понятным.

6.8. Оператор continue

Оператор continue осуществляет переход в конец тела цикла и вычисляет значение управляющего логического выражения. Этот оператор часто используется для пропуска некоторых значений в диапазоне цикла, которые должны игнорироваться или обрабатываться в отдельном фрагменте. Например, при работе с потоком, состоящим из отдельных лексем, лексема “skip” (“пропуск”) может обрабатываться следующим образом:

while (!stream.eof()) {

token = stream.next();

if (token.equals("skip"))

continue;

// ... обработка лексемы ...

}

Оператор continue имеет смысл только внутри циклов— while, do-while и for. В нем может указываться метка внешнего цикла, и в этом случае continue относится к указанному циклу, а не к ближайшему внутреннему. При выполнении такого помеченного оператора continue осуществляется выход из всех внутренних циклов, чтобы выполнить следующую итерацию указанного цикла. В приведенном выше примере можно обойтись без метки в операторе continue, поскольку имеется всего один внешний цикл.

6.9. Оператор return

Оператор return завершает выполнение метода и передает управление в точку его вызова. Если метод не возвращает никакого значения, достаточно простого оператора return:

return;

Если же метод имеет возвращаемый тип, то в оператор return должно входить такое выражение, которое может быть присвоено переменной возвращаемого типа. Например, если метод возвращает double, то в оператор return могут входить выражения типа double, float или целого типа:

protected double nonNegative(double val) {

if (val << 0)

return 0; // константа типа int

else

return val; // double

}

Оператор return также используется для выхода из конструкторов и статических инициализаторов. Конструктор не может возвращать никакого значения, поэтому в этом случае return не содержит возвращаемого значения. Конструкторы вызываются как часть процесса new, который в конечном счете возвращает ссылку на объект, однако каждый конструктор играет в этом процессе лишь частичную роль; ни один из конструкторов не возвращает итоговую ссылку.

6.10. Где же goto?

В Java нет конструкции goto, которая служила бы для передачи управления произвольному оператору внутри метода, хотя она достаточно распространена в языках того семейства, с которым связан язык Java. Оператор goto чаще всего применяется для следующих целей:

  • Управление выполнением внешних циклов из внутренних. Для этого в Java предусмотрены операторы break и continue с метками.

  • Пропуск оставшейся части блока, не входящего в цикл, при нахождении ответа или обнаружении ошибки. Используйте break с меткой.

  • Выполнение завершающего кода при выходе из блока или метода. Используйте либо break с меткой, либо (более наглядно) — конструкцию finally оператора try, рассмотренную в следующей главе.

Операторы break и continue с метками имеют то преимущество, что они передают управление в строго определенную точку программы. Блок finally подходит к передаче управления еще более жестко и работает при всех обстоятельствах, в том числе и при возникновении исключений. С помощью этих конструкций можно писать наглядные программы на Java без применения goto.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]