Програма без обробки виключень.
Завдання 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 {
//код чистить
}
try {
//дії
} catch (SomeException ex) {
//здійснює обробку винятку
} finally {
//чистить
}
try {
//виконує дії
}
//потрібно catch або finally
System.out.println("out of try block");
try {
//виконує дії
}
//не може бути коду між try/catch
System.out.println("out of try block");
catch(Exception ex) { }
Не можна вставляти ніякий код між блоками try, catch, або finally. Наступне не скомпілюється:
try {
// виконує дії
}
System.out.print("below the try"); //некоректно!
catch(Exception ex) { }
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 можна показати або зберегти проміжні результати.