Page 225 - 6253
P. 225
якщо наявний блок catch не обробляє усі типи винятків).
// Обробка двох типів винятків
public class TwoException {
public static void main(String[] args) {
try {
int a = (int) (Math.random() * 2);
System.out.println("a = " + a);
int c[] = { 1 / a };
c[a] = 71;
} catch (ArithmeticException e) {
System.err.println("Ділення на 0" + e);
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println("Вихід за межі масиву: " + e);
}
System.out.println("Після блоку try-catch");
}
}
Виняток «Ділення на 0» виникне при ініціалізації елементу масиву а
нульовим значенням. В іншому випадку (при а = 1) згенерується виняток «Вихід за
межі масиву» при спробі присвоїти значення другому елементу масиву c[], який
містить тільки один елемент. Проте приклад, приведений вище, носить чисто
демонстративний характер і не є зразком хорошого коду, оскільки в цій ситуації
можна було обійтися простою перевіркою аргументів на допустимі значення перед
виконанням операцій. До того ж генерація і обробка винятків – більш ресурсоємна
операція, ніж виклик оператора if для перевірки аргументів. Винятки повинні
застосовуватися тільки для обробки виняткових ситуацій, і якщо існує можливість
обійтися без них, то слід нею скористатися.
Підкласи виняткових ситуацій у блоках catch повинні слідувати перед будь-
яким з їх суперкласів, інакше суперклас перехоплюватиме ці винятки, наприклад:
try {
// Код, який може згенерувати виняток
224