- •Об'єктно-орієнтовані мови. Основні принципи об'єктно-орієнтованого програмування.
- •Відмінності мови Java від інших мов програмування
- •Основні типи даних мови Java.
- •Перетворення даних в програмах на Java.
- •Пакети класів, їх створення та використання.
- •Використання рядків в мові Java. Клас String.
- •Менеджери розташування. Їх призначення та використання Розкладки
- •FlowLayout (послідовне розташування)
- •GridLayout (табличне розташування)
- •BorderLayout (полярне розташування)
- •CardLayout (блокнотне розташування)
- •GridBagLayout (коміркове розташування)
- •Пакет java.Awt. Ієрархія класів в ньому. Клас Component.
- •Контейнери. Їх призначення та загальні методи контейнерів Контейнери
- •Загальні характеристика класу Component (див 13)
- •Використання контейнера Panel та основні його методи. Панель
- •Контейнер Frame, його особливості. Frame (Фрейми)
- •Графічні засоби мови Java. Клас Canvas.
- •Реалізація роботи прапорців та пермикачів. Checkbox (Прапорець та Перемикач)
- •Клас Graphics. Малювання графічних примітивів.
- •Виведення тексту. Клас Font.
- •Повідомлення та події. Поля та методи класу Event Класи подій
- •Обробка повідомлень миші. Основні методи.
- •Виведення растрових зображень. Класи Url та Image. Завантаження растрового зображення
- •Виведення зображення
- •Клас Image
- •Способи усунення мерехтіння при виведенні інформації на екран. Усунення мерехтіння
- •Потоки. Клас Thread.Створення потоків.
- •Створення потоків
- •Виняткові ситуації. Класи Throwable, Exception, Error. 29. Методи обробки виняткових ситуацій.
- •Аплети у порівнянні з додатками
- •Проблема безпеки
- •Включення аплетів в html-документ Створення аплетів
- •Введення-виведення даних. Базові класи введення-виведення
- •Дати порівняльну характеристику протоколів стеку tcp/ip та udp.
- •Створення сокетів tcp
- •4.3 Робота з потоковими сокетами
- •Клас Socket
- •Клас ServerSocket
- •Створення сокетів udp
- •Клас DatagramSocket
- •Клас DatagramPacket
- •Приклад серверного додатку, що реалізує датаграмний сокет.
- •Приклад клієнтського додатку, що реалізує датаграмний сокет.
Виняткові ситуації. Класи 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, ArithmeticException) та явна програмна генерація за допомогою оператора throw: наприклад, throw new IllegalArgumentException. В будь-якому випадку програма має перехопити виняток та обробити його в блоці try-catch.
