Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpori_oop.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
441.86 Кб
Скачать
  1. Виняткові ситуації. Класи Throwable, Exception, Error. 29. Методи обробки виняткових ситуацій.

Виняток або виключення (exception) – це спеціальний тип помилки, який виникає у випадку неправильної роботи програми. Виняткова (ви­ключ­на) ситуація може виникнути при роботі Java-програми в результаті, на­при­клад, ділення на нуль або може бути ініційована програмно в середині ме­то­да деякого класу. Прикладом такого винятку, що генерується програмно, мо­же служити FileNotFoundException, який викидається (throw) методами кла­сів введення-виведення при спробі відкрити неіснуючий файл. Замість тер­мі­ну “викидається” часто вживають синоніми: збуджується, генерується, ініціюється.

Після того як Java-машина створить об’єкт-виняток, цей об’єкт пересилається додатку. Об’єкт, що утворюється при збудженні винятку, несе інформацію про виняткову ситуацію (точка виникнення, опис тощо). Використовуючи методи цього об’єкта можна, наприклад, вивести на екран або в файл інформацію про цей виняток.

Додаток має перехопити виняток. Для перехоплення використовується так званий try-catch блок. Наприклад, при спробі читання даних з потоку стан­дартного пристрою введення-виведення може виникнути виняток IOException:

try {

System.in.read(buffer, 0, 255);

. . .

}

catch (IOException e) {

String err = e.toString();

System.out.println(err);

}

Якщо читання не вдалося, Java ігнорує всі інші оператори в блоці try і переходить на блок catch, в якому програма обробляє виняток. Якщо все відбувається нормально, весь код в середині блока try виконується, а блок catch пропускається.

Зверніть увагу. Блок catch нагадує метод, адже йому передається як параметр об’єкт-виняток. Тип параметра – IOException, ім’я параметра – e. В об’єктному світі Java живуть майже самі об’єкти. І e – це також об’єкт класу IOException. Можна звернутися до методів цього об’єкта, наприклад, щоб отримати інформацію про виняток. Це і відбувається в нашому прикладі (метод toString()).

Що буде, якщо не перехопити виняток? В принципі, нічого особ­ли­во­го. Просто виконання даного потоку команд припиниться та буде виведено системне повідомлення на консоль. Роботу програми при цьому, можливо, бу­де завершено, а, можливо, і ні (якщо програма має декілька потоків ви­ко­нання – наприклад, діалогові програми, не завершуються, а лише видають повідомлення на консоль. Погано, що ці повідомлення можна навіть не побачити).

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

Звідси висновок: обробляти виняток необов’язково в тому ж самому методі, в якому він генерується.

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

public void actionPerformed(ActionEvent evt)

{

String arg = evt.getActionCommand();

if ("Check".equals(arg))

{

String str1 = textField1.getText();

String str2 = textField2.getText();

int first = Integer.parseInt(str1);

int second = Integer.parseInt(str2);

String answer = "No";

if (first*first==second || second*second==first)

{ answer = "Yes" ; }

displayStr = "Check Square - " + answer;

repaint();

}

}

Навіть в такій простій програмі можуть виникнути винятки, пов’язані з введенням даних користувачем. Отже, користувач натискає кнопку Check, а дані не введено. Маємо виняткову ситуацію NumberFormatException, про яку сповіщає Java. Давайте змінимо програму, щоб вона перехоплювала виняток:

public void actionPerformed(ActionEvent evt)

{

String arg = evt.getActionCommand();

if ("Check".equals(arg))

{

String str1 = textField1.getText();

String str2 = textField2.getText();

try {

int first = Integer.parseInt(str1);

int second = Integer.parseInt(str2);

String answer = "No";

if (first*first==second || second*second==first)

answer = "Yes" ;

displayStr = "Check Square - " + answer;

}

catch (NumberFormatException e) {

displayStr = “Input format error;

}

repaint();

}

}

Тепер все гаразд, заодно ми запобігли і неправильному введенню (букви замість цифр).

Якщо додати ще один рядок

first=first/second;

(просто так, логіка програми цього не вимагає), ми отримаємо ще один виняток, на цей раз ArithmeticException. Його також можна обробити:

public void actionPerformed(ActionEvent evt)

{

String arg = evt.getActionCommand();

if ("Check".equals(arg))

{

String str1 = textField1.getText();

String str2 = textField2.getText();

try {

int first = Integer.parseInt(str1);

int second = Integer.parseInt(str2);

String answer = "No";

first = first/second;

if (first*first==second || second*second==first)

answer = "Yes" ;

displayStr = "Check Square - " + answer;

}

catch (NumberFormatException e) {

displayStr = “Input format error”;

}

catch (ArithmeticException e) {

displayStr = “Division by zero”

}

repaint();

}

}

Два блоки catch ідуть один за одним, щоб обробити кожен виняток з блоку try.

При написанні власних методів ви також маєте враховувати, що вони можуть збуджувати винятки. В цьому випадку метод має виглядати так:

public int fact(int num) throws IllegalArgumentException

{

if ( num < 0 || num>10)

{

throw new IllegalArgumentException(“Number out of range”);

}

int res=1;

for (int i =1; i<=num; i++)

res*= i;

return res;

}

Оскільки в методі fact() виняток не оброблявся, його має обробити метод, який викликав fact():

try {

f = fact(x);

. . .

}

catch (IllegalArgumentException e) {

displayStr=e.toString();

}

Можна створювати власні класи винятків, але це зовсім інша тема [2].

Підводячи підсумки, можна сказати, що існує два варіанти генерації винятків: автоматична генерація (наприклад, IOException, Arithmetic­Excep­tion) та явна програмна генерація за допомогою оператора throw: наприк­лад, throw new IllegalArgumentException. В будь-якому випадку програма має перехопити виняток та обробити його в блоці try-catch.

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