Программирование на Java
Шрифт:
outerLoop: for(int i=0;i<5;i++) {
for(j=0;j<4; j++) {
...
if(array[i][j] == caseValue)
break outerLoop;
...
}
}
...
Оператор break также может использоваться с именованными блоками.
Между операторами break и continue есть еще одно существенное отличие. Оператор break может использоваться с любым именованным блоком, в этом случае его действие в чем-то похоже на действие goto. Оператор continue (как и отмечалось ранее) может быть использован только в теле цикла. То есть такая конструкция будет вполне приемлемой:
lbl: {
...
if( val > maxVal) break lbl;
...
}
В
Метки используют пространство имен, отличное от пространства имен классов и методов.
Так, следующий пример кода будет вполне работоспособным:
public class Test {
public Test {
}
public static void main(String[] args) {
Test t = new Test;
t.test;
}
void test {
Test:
{
test: for(int i =0;true;i++) {
if(i % 2 == 0) continue test;
if(i > 10) break Test;
System.out.print(i + " ");
}
}
}
}
Для составления меток применяются те же синтаксические правила, что и для переменных, за тем исключением, что метки всегда оканчиваются двоеточием. Метки всегда должны быть привязаны к какому-либо блоку кода. Допускается использование меток с одинаковыми именами, но нельзя применять одинаковые имена в пределах видимости блока. Т.е. такая конструкция допустима:
lbl: {
...
System.out.println("Block 1");
...
}
...
lbl: {
...
System.out.println("Block 2");
...
}
А такая нет:
lbl: {
...
lbl: {
...
}
...
}
Оператор return
Этот оператор предназначен для возврата управления из вызываемого метода в вызывающий. Если в последовательности операторов выполняется return, то управление немедленно (если это не оговорено особо) передается в вызывающий метод. Оператор return может иметь, а может и не иметь аргументов. Если метод не возвращает значений (объявлен как void ), то в этом и только этом случае выражение return применяется без аргументов. Если возвращаемое значение есть, то return обязательно должен применяться с аргументом, чье значение и будет возвращено.
В качестве аргумента return может использоваться выражение
return (x*y +10) / 11;
В этом случае сначала будет выполнено выражение, а затем результат его выполнения будет передан в вызывающий метод. Если выражение будет завершено ненормально, то и оператор return будет завершен ненормально. Например, если во время выполнения выражения в операторе return возникнет исключение, то никакого значения метод не вернет, будет обрабатываться ошибка.
В методе может быть более одного
Оператор synchronized
Этот оператор применяется для исключения взаимного влияния нескольких потоков при выполнении кода, он будет подробно рассмотрен в лекции 12, посвященной потокам исполнения.
Ошибки при работе программы. Исключения (Exceptions)
При выполнении программы могут возникать ошибки. В одних случаях это вызвано ошибками программиста, в других - внешними причинами. Например, может возникнуть ошибка ввода/вывода при работе с файлом или сетевым соединением. В классических языках программирования, например, в С, требовалось проверять некое условие, которое указывало на наличие ошибки, и в зависимости от этого предпринимать те или иные действия.
Например:
...
int statusCode = someAction;
if (statusCode) {
... обработка ошибки
}
else {
statusCode = anotherAction;
if(statusCode) {
... обработка ошибки ...
}
}
...
В Java появилось более простое и элегантное решение - обработка исключительных ситуаций.
try {
someAction;
anotherAction;
} catch(Exception e) {
// обработка исключительной ситуации
}
Легко заметить, что такой подход является не только изящным, но и более надежным и простым для понимания.
Причины возникновения ошибок
Существует три причины возникновения исключительных ситуаций.
* Попытка выполнить некорректное выражение. Например, деление на ноль, или обращение к объекту по ссылке, равной null, попытка использовать класс, описание которого ( class -файл) отсутствует, и т.д. В таких случаях всегда можно точно указать, в каком месте произошла ошибка, - именно в некорректном выражении.
* Выполнение оператора throw Этот оператор применяется для явного порождения ошибки. Очевидно, что и здесь можно указать место возникновения исключительной ситуации.
* Асинхронные ошибки во время исполнения программы.
– Причиной таких ошибок могут быть сбои внутри самой виртуальной машины (ведь она также является программой), или вызов метода stop у потока выполнения Thread.
– В этом случае невозможно указать точное место программы, где происходит исключительная ситуация. Если мы попытаемся остановить поток выполнения (вызвав метод stop ), нам не удастся предсказать, при выполнении какого именно выражения этот поток остановится.
Таким образом, все ошибки в Java делятся на синхронные и асинхронные. С первыми сравнительно проще работать, так как принципиально возможно найти точное место в коде, которое является причиной возникновения исключительной ситуации. Конечно, Java является строгим языком в том смысле, что все выражения до точки сбоя обязательно будут выполнены, и в то же время ни одно последующее выражение никогда выполнено не будет. Важно помнить, что ошибки могут возникать как по причине недостаточной внимательности программиста (отсутствует нужный класс, или индекс массива вышел за допустимые границы), так и по независящим от него причинам (произошел разрыв сетевого соединения, сбой аппаратного обеспечения, например, жесткого диска и др.).