Назад Зміст Вперед

Лабораторна робота:«Дослідження методів із IOException»

Програма без обробки виключень.

Завдання 1. Перехопити виключення за допомогою try catch.
class SimpleExt {
public static void main(String[] args)({
int n = Integer.parselnt(args[0]);
System.out.println("10 / n = " + (10 / n));
System.out.println("After all actions"); }

Завдання 2. Перехопити виключення за допомогою try catch finally.
package exception;
public class Dispatcher {
public static void main(String[] args) {
int x=10;
int y=0;
int [] a={2, 7, 5};
System.out.println("Start");
System.out.println(x/y);
System.out.println("After divided");
System.out.println(a[2]);
System.out.println("After arrays element");
System.out.println("In catch");
System.out.println(ae);
System.out.println("In catch divaded");
System.err.println(ae);
System.out.println("Finally");
System.out.println("End");
}
}

Приклад використання try з finally, але без catch:


try {
  // дії
} finally {
  //код чистить
}

Наступний коректний код демонструє trycatch і finally:

try {
  //дії
} catch (SomeException ex) {
  //здійснює обробку винятку
} finally {
  //чистить
}

Наступний НЕКОРЕКТНИЙ код демонструє try без catch або finally:

try {
  //виконує дії
}
  //потрібно catch або finally
System.out.println("out of try block");

Наступний НЕКОРЕКТНИЙ код демонструє неправильно розміщений блок catch:

try {
  //виконує дії
}
  //не може бути коду між try/catch
System.out.println("out of try block");
catch(Exception ex) { }

Некоректно використовувати оператор try без оператора catch або finally. Оператор try сам по собі викликає помилку компілятора. Будь-які оператори catch мусять іти безпосередньо за блоком try. Будь-який оператор finally мусить розміщуватись за останнім оператором catch (або за блоком try, якщо немає catch). Допускається відсутність одного з двох операторів catch або finally, але не обох одночасно.

Не можна вставляти ніякий код між блоками trycatch, або finally. Наступне не скомпілюється:

try {
  // виконує дії
}
System.out.print("below the try"); //некоректно!
catch(Exception ex) { }

Одному try може відповідати відразу кілька блоків catch з різними класами винятків.
import java.util.Scanner; class Main { 
    public static void main(String[] args) { 
     int[] m = {-1,0,1}; 
        Scanner sc = new Scanner(System.in); 
        try { 
            int a = sc.nextInt();     
            m[a] = 4/a; 
            System.out.println(m[a]); 
        } catch (ArithmeticException e) { 
            System.out.println("Відбулася неприпустима арифметична операція"); 
        } catch (ArrayIndexOutOfBoundsException e) { 
            System.out.println("Звернення по неприпустимого індексу масиву"); 
        } 
    } }

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

Якщо користувач введе 0, то виникне виключення класу ArithmeticException, і воно буде оброблено першим блоком catch

Якщо користувач введе 3, то виникне виключення класу ArrayIndexOutOfBoundsException (вихід за боковий вівтар масиву), і воно буде оброблено другим блоком catch

Якщо користувач введе неціле число, наприклад, 3.14, то виникне виключення класу InputMismatchException (невідповідність типу вводиться значення), і воно буде викинуто в форматі стандартної помилки, оскільки його ми ніяк не обробляли. 

Можна, однак, додати обробник для класу Exception, оскільки цей клас батьківський для всіх інших контрольованих винятків, то він буде перехоплювати будь-які з них (в тому числі, і InputMismatchException).

import java.util.Scanner; class Main { 
    public static void main(String[] args) { 
        int[] m = {-1,0,1}; 
        int a = 1; 
        Scanner sc = new Scanner(System.in);        
        try { 
            a = sc.nextInt();     
            m[a-1] = 4/a;
            System.out.println(m[a]); 
        } catch (ArithmeticException e) { 
            System.out.println("Відбулася неприпустима арифметична операція"); 
        } catch (ArrayIndexOutOfBoundsException e) { 
            System.out.println("Звернення по неприпустимого індексу масиву");       
        } catch (Exception e) { 
            System.out.println("Сталося ще якесь виключення"); 
        } 
    } }

Оскільки виключення побудовані на ієрархії класів і підкласів, то спочатку треба намагатися обробити більше приватні виключення і лише потім більш загальні. Тобто поставивши першим (а не третім) блок з обробкою виключення класу Exception, ми б ніколи не побачили ніяких повідомлень про помилку, окрім «Сталося ще якесь виключення» (все виключення перехопити б відразу цим блоком і не доходили б до інших) .

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