Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка Java.doc
Скачиваний:
42
Добавлен:
01.05.2019
Размер:
4 Мб
Скачать
☆

Глава 5. Управляющие конструкции Составной оператор

Согласно синтаксису языка Java во многих конструкциях может стоять только один оператор, но часто встречается ситуация, когда надо использовать последовательность из нескольких операторов.

Составной оператор — блок кода между фигурными скобками {}:

Имеется два общепринятых способа форматирования текста с использованием фигурных скобок.

В первом из них скобки пишут друг под другом, а текст, находящийся между ними, сдвигают на 1-2 символа вправо (изредка – больше). Пример:

оператор

{

последовательность простых или составных операторов

}

Во втором, более распространённом, открывающую фигурную скобку пишут на той же строке, где должен начинаться составной оператор, без переноса его на следующую строку. А закрывающую скобку пишут под первым словом. Пример:

оператор{

последовательность простых или составных операторов

}

Именно такой способ установлен по умолчанию в среде NetBeans, и именно он используется в приводимых в данной книге фрагментах программного кода. Тем не менее, автор предпочитает первый способ форматирования программного кода, так как он более читаемый. Для установки такого способа форматирования исходного кода следует перейти в меню Tools/Options, выбрать Editor/Indentation, после чего в появившейся диалоговой форме отметить галочкой пункт Add New Line Before Brace.

После фигурных скобок по правилам Java, как и в /C++, ставить символ “;” не надо. Но его можно ставить после фигурных скобок в тех местах программы, где разрешается ставить ничего не делающий пустой оператор “;” .

Условный оператор if

У условного оператора if имеется две формы: if и if- else.

По-английски if означает “если”, else - “в противном случае”. Таким образом, эти операторы могут быть переведены как “если…то…” и “если…то…в противном случае…”.

Первая форма:

if(условие)

оператор1;

Если условие равно true, выполняется оператор1. Если же условие==false, в операторе не выполняется никаких действий.

Вторая форма:

if(условие)

оператор1;

else

оператор2;

В этом варианте оператора if если условие==false, то выполняется оператор2.

Обратите особое внимание на форматирование текста. Не располагайте все части оператора if на одной строке – это характерно для новичков!

Пример:

if(a<b)

a=a+1;

else if(a==b)

a=a+1;

else{

a=a+1;

b=b+1;

};

Из этого правила имеется исключение: если подряд идёт большое количество операторов if, умещающихся в одну строку, для повышения читаемости программ бывает целесообразно не переносить другие части операторов на отдельные строки.

Надо отметить, что в операторе if в области выполнения, которая следует после условия, а также в области else, должен стоять только один оператор, а не последовательность операторов. Поэтому запись оператора в виде

if(условие)

оператор1;

оператор2;

else

оператор3;

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

if(условие){

оператор1;

оператор2;

}

else

оператор3;

Если же мы напишем

if(условие)

оператор1;

else

оператор2;

оператор3;

- никакой диагностики ошибки компилятор не выдаст! Оператор3 в этом случае никакого отношения к условию else иметь не будет – подобное форматирование текста будет подталкивать к логической ошибке. При следующем форматировании текста программы, эквивалентному предыдущему при компиляции, уже более очевидно, что оператор3 не относится к части else:

if(условие)

оператор1;

else

оператор2;

оператор3;

Для того, чтобы оператор3 относился к части else, следует использовать составной оператор:

if(условие)

оператор1;

else{

оператор2;

оператор3;

};

В случае последовательности операторов типа:

if(условие1)if(условие2)оператор1 else оператор2;

имеющийся else относится к последнему if, поэтому лучше отформатировать текст так:

if(условие1)

if(условие2)

оператор1;

else

оператор2;

Таким образом, если писать соответствующие if и else друг под другом, логика работы программы становится очевидной.

Пример неправильного стиля оформления:

if(условие1)

if(условие2)

оператор1;

else

оператор2;

Этот стиль подталкивает к логической ошибке при чтении программы. Человек, читающий такую программу (как и тот, кто её писал), будет полагать, что оператор2 выполняется, если условие1==false, так как кажется, что он относится к первому if, а не ко второму. Надо отметить, что сама возможность такой ошибки связана с непродуманностью синтаксиса языка Java. Для правильной работы требуется переписать этот фрагмент в виде

if(условие1){

if(условие2)

оператор1;

};

else оператор2;

Чтобы избегать такого рода проблем, используйте опцию Reformat code (“переформатировать код”) из всплывающего меню, вызываемого в исходном коде щелчком правой кнопки мыши.

Типичной является ситуация с забытым объединением последовательности операторов в составной с помощью фигурных скобок. Например, пишут

if(условие)

оператор1;

оператор2;

вместо

if(условие)

{оператор1;

оператор2;

};

Причём такую ошибку время от времени допускают даже опытные программисты. Reformat code не помогает – обычно эта команда вызывается после того, как программист далеко ушёл от проблемного места, и перенос оператора под начало “if” не замечает. Для того, чтобы гарантированно избежать такой ошибки, следует ВСЕГДА ставить фигурные скобки в тех местах операторов Java, где по синтаксису может стоять только один оператор. Конечно, было бы лучше, чтобы разработчики Java предусмотрели такую конструкцию как часть синтаксиса языка. Возможно, в среде NetBeans в дальнейшем будет сделана возможность в опциях редактора делать установку, позволяющую автоматически создавать эти скобки. Точно так же, как автоматически создаётся закрывающая круглая скобка в операторе if после того как вы набираете if( .

Следует отметить разные правила использования точки с запятой при наличии части else в случае использования фигурных скобок и без них:

if(i==0)

i++;

else

i--;

Во втором случае после скобок (перед else) точка с запятой не ставится:

if(i==0){

i++;

}

else{

i--;

};

Неприятной проблемой, унаследованной в Java от языка C, является возможность использования оператора присваивания “=” вместо оператора сравнения “==”. Например, если мы используем булевские переменные b1 и b2, и вместо

if(b1==b2)

i=1;

else

i=2;

напишем

if(b1=b2)

i=1;

else

i=2;

никакой диагностики ошибки выдано не будет. Дело в том, что по правилам C и Java любое присваивание рассматривается как функция, возвращающая в качестве результата присваиваемое значение. Поэтому присваивание b1=b2 возвратит значение, хранящееся в переменной b2. В результате оператор будет работать, но совсем не так, как ожидалось. Более того, будет испорчено значение, хранящееся в переменной b1.

Проблемы с ошибочным написанием “=” вместо “==” в Java гораздо менее типичны, чем в C/C++, поскольку они возникают только при сравнении булевской переменной с булевским значением. Если же оператор “=” ставится вместо “==” при сравнении числовой переменной, происходит диагностика ошибки, так как такое присваивание должно возвращать число, а не булевское значение. Жёсткая типизация Java обеспечивает повышение надёжности программ.