Коли застосовуються виключення

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

while ((token = streamnext()) = StreamEND)

process(token)

streamclose()

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

try {

for (;) {

process(streamnext())

}

} catch (StreamEndException e) {

streamclose()

}

У першому випадку логіка виконання програми виявляється прямолінійною і зрозумілою Цикл виконується до тих пір, поки не буде досягнутий кінець вхідного потоку, після чого потік закривається У другому випадку цикл виглядає так, немов він виконується нескінченно Якщо не знати про те, що про кінець введення сигналізує StreamEndException, то стає незрозуміло, коли ж відбувається вихід з циклу Втім, навіть якщо ви здогадуєтеся про існування StreamEndException, то факт завершення циклу виявляється винесеним з його тіла (for) в зовнішній блок try, що ускладнює розуміння того, що відбувається

Зустрічаються ситуації, в яких неможливо знайти прийнятний код повернення Наприклад, у класі, що представляє потік значень типу double, може міститися будь-яке припустиме double, тому числовий маркер кінця потоку неможливий Більш розумний підхід передбачає спеціальний метод eof для перевірки кінця потоку, який повинен виконуватися перед кожною операцією читання:

while (streameof())

process(streamnextDouble())

streamclose()

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

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

Вирішити, яка ситуація є передбачуваною, а яка – ні, часом буває нелегко

Головне – не зловживати винятками для повідомлень про передбачуваних ситуаціях

Вправа 72

Як, на вашу думку, програма повинна повідомляти програмісту про таких ситуаціях:

Програма намагається привласнити відємне значення місткості машини в обєкті PassengerVehicle

У файлі конфігурації, використовуваному для завдання початкового стану обєкта,

виявлена ​​синтаксична помилка

Метод, який шукає в строковому масиві вказане програмістом слово, не може знайти жодного примірника такого слова

Файл, який передається методу open, не існує

Файл, який передається методу open, існує, але система безпеки не дозволяє користувачеві працювати з ним

При спробі встановити мережеве зєднання з віддаленим процесом-сервером не вдається звязатися з віддаленим компютером

Під час взаємодії з віддаленим процесом-сервером зєднання з мережею переривається

Глава 8

РЯДКИ

Що толку в хорошій цитаті, якщо її не можна змінити

Доктор Who, The Two Doctors

Рядки в Java є стандартними обєктами з вбудованою мовною підтримкою Нам вже зустрічалася безліч прикладів того, як строкові обєкти створюються на основі літералів крім того, ми бачили, як оператори + і + = застосовуються для конкатенації і створення нових рядків Проте функції класу String цим не обмежуються Обєкти String доступні тільки для читання, тому в Java також є клас StringBuffer для змінюваних рядків У цьому розділі описані класи String і StringBuffer, а також перетворення рядків в інші типи – наприклад, цілий або логічний

Джерело: Арнольд К, Гослінг Д – Мова програмування 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>

*

*