Оператор for

використовується для виконання циклу за значеннями з певного діапазону Він виглядає наступним чином:

for (ініціалізація логічне вираження прирощення)

оператор

Такий запис еквівалентна

{

ініціалізація

while (логічний вираз) {

оператор прирощення

}

}

за тим винятком, що прирощення завжди виконується, якщо в тілі циклу зустрічається оператор continue (див розділ Оператор continue)

Звичайне застосування циклу for – почергове привласнення змінної значень із деякого діапазону, поки не буде досягнутий кінець цього діапазону

Вирази ініціалізації та прирощення в циклі for можуть являти собою список значень, поділюваних коми Обчислення цих виразів, як і в інших операторах, відбувається зліва направо Наприклад, щоб за допомогою двох індексів перебрати всі елементи масиву в протилежних напрямках, можна скористатися наступним виразом:

for ( i = 0, j = arrlength – 1 j &gt&gt= 0 i++, j–) {

// ..

}

Користувач сам вибирає діапазон значень змінної циклу Наприклад, цикл for часто застосовується для перебору елементів звязного списку або значень, що входять в математичну послідовність Завдяки цьому конструкція for в Java виявляється істотно більш потужною, ніж в інших мовах програмування, в яких можливості циклів for обмежуються приростом змінної в заздалегідь заданому діапазоні

Наведемо приклад циклу, який обчислює найменший показник (exp), такий, що 10

в ступені exp перевершує задану величину:

public static int tenPower(int value) {

int exp, v

for (exp = 0, v = value – 1 v &gt&gt 0 exp++, v /= 10)

continue

return exp

}

В даному випадку в циклі одночасно змінюються дві змінні: показник ступеня (exp) і значення 10exp (v) Ці змінні є взаємоповязаними У подібних випадках розділений комами список є коректним способом забезпечення синхронізації значень

Тіло циклу являє собою простий оператор continue, початківець наступну ітерацію циклу У тілі циклу вам нічого не доводиться робити – все відбувається в перевіряється умови та в вираженні-ітерації Використаний в даному прикладі оператор continue – одна з можливостей створити пусте тіло циклу замість нього можна було залишити окремий рядок, що складається з однієї крапкою з комою, або створити порожній блок в фігурних дужках Просто обмежитися крапкою з комою в кінці рядка з оператором for було б досить небезпечно – якщо крапка з комою буде випадково видалена, то оператор, наступний за for, перетвориться в тіло циклу

Всі вирази в заголовку циклу for є необовязковими Якщо пропустити ініціалізацію або приріст, то відповідна частина циклу просто не виконується Відсутнє логічне вираження вважається завжди рівним true Отже, для створення нескінченного циклу можна скористатися наступною записом:

for (;)

оператор

Мається на увазі, що цикл буде перервано іншими засобами – скажімо, описаним нижче оператором break або збудженням винятку

За загальноприйнятою угодою цикл for використовується для діапазонів взаємоповязаних значень Порушення цієї угоди, коли вираження ініціалізації або прирощення не мають ніякого відношення до перевірки логічного умови, вважається проявом поганого стилю програмування

Вправа 63

Напишіть метод, який отримує два параметри типу char і виводить всі символи,

лежать в діапазоні між ними (включаючи їх самих)

66 Мітки

Операторам можуть присвоюватися мітки Найчастіше мітки застосовуються в блоках і циклах Мітка передує оператору наступним чином:

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

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

67 Оператор break

Оператор break застосовується для виходу з будь-якого блоку, не тільки з оператора switch Найчастіше оператор break служить для переривання циклу, але він може використовуватися для негайного виходу з будь-якого блоку У наведеному нижче прикладі цей оператор допомагає знайти перший порожній елемент в масиві посилань на обєкти Contained:

class Container {

private Contained[] Objs

// ..

public void addIn(Contained obj)

throws NoEmptySlotException

{

int i

for (i = 0 i &lt&lt Objslength i++)

if (Objs[i] == null)

break

if (i &gt&gt= Objslength)

throw new NoEmptySlotException()

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

objinside (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 &lt&lt Matrixlength y++) {

for (x = 0 x &lt&lt 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, в якому використовується мітка, здійснює вихід лише з конкретного поміченого блоку, а порядок виконання програми залишається цілком зрозумілим

68 Оператор continue

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

while (streameof()) {

token = streamnext()

if (tokenequals(&quotskip&quot))

continue

/ / .. Обробка лексеми ..

}

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

69 Оператор return

Оператор return завершує виконання методу і передає управління в точку його виклику Якщо метод не повертає ніякого значення, досить простого оператора return:

return

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

protected double nonNegative(double val) {

if (val &lt&lt 0)

return 0 / / Константа типу int

else

}

return val  // double

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

610 Де ж goto

У Java немає конструкції goto, яка служила б для передачі управління безпідставного оператору всередині методу, хоча вона досить поширена в мовах того сімейства, з яким повязаний мову Java Оператор goto найчастіше застосовується для таких цілей:

Управління виконанням зовнішніх циклів з внутрішніх Для цього в Java

передбачені оператори break та continue з мітками

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

Виконання завершального коду при виході з блоку або методу Використовуйте або break з міткою, або (більш наочно) – конструкцію finally оператора try, розглянуту в наступному розділі

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

Глава 7

ВИНЯТКИ

Погано підігнане спорядження може змусити ваш гранатомет M203 вистрілити в найнесподіваніший момент

Подібна пригода погано позначиться на вашій репутації серед тих, хто залишиться в живих

Журнал PS армії США,

Серпень 1993

Під час своєї роботи додаток іноді стикається з різного роду позаштатними ситуаціями При виклику методу деякого обєкта він може виявити у себе внутрішні проблеми (невірні значення змінних), знайти помилки в інших обєктах або даних (наприклад, у файлі або мережевому адресу), визначити факт порушення свого базового контракту (читання даних із закритого потоку) і так далі

Багато програмістів не перевіряють всі можливі джерела помилок, і на те є вагома причина: якщо при кожному виклику методу аналізувати всі мислимі помилки, текст програми стає абсолютно незрозумілим Таким чином досягається компроміс між правильністю (перевірка всіх помилок) і ясністю (відмова від захаращення основний логіки програми безліччю перевірок)

Винятки надають зручну можливість перевірки помилок без захаращення тексту програми Крім того, виключення безпосередньо сигналізують про помилки, а не змінюють значення прапорів або яких-небудь полів, які потім потрібно перевіряти

Винятки перетворюють помилки, про які може сигналізувати метод, в явну частину контракту цього методу Список винятків видно програмісту, перевіряється компілятором і зберігається в розширених класах, переобумовленої даний метод

Виняток підзбуждается, Коли виникає несподіване помилкове стан Потім виняток перехоплюється відповідним умовою в стеку виклику методів Якщо винятку не перехоплено, спрацьовує обробник виключення за замовчуванням, який зазвичай виводить корисну інформацію про виключення (скажімо, вміст стека викликів)

Джерело: Арнольд К, Гослінг Д – Мова програмування Java (1997)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*