Завантажити

Download Report

Transcript Завантажити

Лекція 6. Обробка виключних ситуацій
План лекції:
1. Виключні ситуації та їх типи
2. Оператори try-catch
3. Багатократний catch-оператор
4. Вкладені try-оператори
5. Явне викидання виключень
6. Вбудовані виключення Java
7. Створення підкласів виключень
1
Виключні ситуації
► Виключна ситуація – помилка, що виникає в процесі виконання програми
► В Java виключення – це об’єкт, що описує виключну (помилкову) ситуацію
► При створенні помилкової (виключної) ситуації автоматично створюється
об’єкт, що описує цю помилкову ситуацію і “вкидається” в метод, що викликав
помилку
► Метод може обробити виключення або передати його далі
► Виключення генеруються системою Java або «вручну»
користувачем
► Обробка виключень виконується в блоці try{}-catch(){}-finally{}
► Якщо в блоці try{} має місце виключення, це виключення можна
перехопити і обробити за допомогою коду, розміщеного в блоці
catch(){}
► Виключення виконавчою системою Java викидаються
автоматично. «Вручну» виключення викидають за допомогою
ключового слова throw
► Виключення, що викидаються з метода, визначаються через
ключове слово throws
► В блоці finally вказується код, що виконується обов’язково
2
Загальна схема
try{
// код що генерує (може) виключення
}
catch(Тип_виключення_1 об’єкт){
// код для обробки виключення
}
catch(Тип_виключення_2 об’єкт){
// код для обробки виключення
}
...
finally{
// код що виконується обов’язково
}
Не обов’язково
3
Типи виключних ситуацій
► Виключення є підкласами класу Throwable
► У класа Throwable є 2 підкласи: Exception та Error
Throwable
Exception
RuntimeException
Error
Помилкові ситуації, що не передбачені
користувачем (наприклад, переповнення стека)
– це “катастрофічні” помилки, що не можуть
бути оброблені в програмі
Помилкові ситуації, що перехоплюються програмами користувача.
Виключення для RuntimeException визначені автоматично: наприклад,
ділення на нуль або недопустима індексація масиву
4
Невідловлені виключення
► Як тільки виконавча система Java виявляє
помилку (наприклад, ділення на нуль), вона створює
новий об’єкт виключення і викидає його
► Виключення має бути негайно обробником
виключних ситуацій
► Якщо виключення не перехоплено в програмі, воно
буде оброблене обробником за умовчанням
► Обробник відображає на екрані рядок з описом
помилкової ситуації і ЗАВЕРШУЄ ПРОГРАМУ
5
Опера тори try і catch – Приклад 1
class ExceptionDemo{
public static void main(String args[]){
int a,b;
try{
b=0;
Зверніть увагу!
a=100/b;
}catch(ArithmeticException e){
System.out.println("Ділення на нуль!");}
System.out.println("Виконання програми
продовжено!");}
}
ЗАПУСТИТИ
6
Опера тори try і catch – Приклад 2
import java.util.Random;
class ExcepionDemo2{
public static void main(String args[]){
int a=0, b=0, c=0;
Random r=new Random();
for(int i=0;i<32000;i++){
try{
b=r.nextInt(200);
c=r.nextInt(100);
a=10000/b/c;
}catch(ArithmeticException e){
System.out.println("Ділення на нуль!");
a=0;}
System.out.println("a="+a);}
}}
Цикл for
ЗАПУСТИТИ
7
Опис виключень
► Клас Throwable переозначає метод toString() (визначений в класі
Object) так, що метод повертає рядок, що описує помилкову
ситуацію. Цей опис можна відображати за допомогою методу
println(), передавши йому аргументом об’єкт виключення
Приклад
class ExceptionDemo3{
ЗАПУСТИТИ
public static void main(String args[]){
int a,b;
try{
b=0;
a=100/b;
}catch(ArithmeticException e){
Зверніть увагу!
System.out.println(“Помилка: ”+e);}
System.out.println("Виконання програми продовжено!");}
}
8
Багатократний оператор catch
► В межах одного блоку try може викликатись декілька виключень
► При виникненні виключення по черзі перебираються всі catch-оператори до
першого “правильного”, який і виконується. Далі програма виконується після trycatch блоку
import java.util.Random;
class MultiCatchDemo{
public static void main(String args[]){
Random r=new Random();
int MyArray[]={0,2};
for(int i=1;i<10000;i++){
try{
a=r.nextInt(3);
b=10/MyArray[a];
System.out.println(b);
}catch(ArithmeticException e){
System.out.println("Ділення на нуль!");}
catch(ArrayIndexOutOfBoundsException e){
System.out.println("Вихід за межі масиву!");}
finally{System.out.println("**************");}}
System.out.println("Цикл for завершено!");}}
int a,b;
ЗАПУСТИТИ
9
Вкладені оператори try
► Допускається ситуація, коли один try-оператор
знаходиться всередині іншого try-оператора. В цьому
випадку говорять про вкладені try-оператори
► Якщо внутрішній try-оператор не містить catch-блоку
для специфічного виключення, переглядаються catchблоки зовнішнього try-оператора
► Вкладена try-інструкція може бути всередині методу,
що викликається в зовнішньому try-блоці
► При вході в блок try контекст відповідного виключення
переписується в стек. Якщо внутрішній try-оператор не
містить catch-блоку для обробки помилкової ситуації,
стек починає “розкручуватись”
10
Вкладені оператори try – Приклад 1
import java.util.Random;
class NestTry{
ЗАПУСТИТИ
public static void main(String args[]){
Random r=new Random();
for(int i=1;i<10000;i++){
try{
int a=r.nextInt(3);
// значення 0,1 або 2
int b=100/a;
//можливе ділення на нуль
System.out.println("b="+b);
try{
if(a==1) a=a/(a-1);
// ділення на нуль
if(a==2){
int c[]={-1};
c[a]=200;
// вихід за межі масиву
} }catch(ArrayIndexOutOfBoundsException e){
System.out.println("Вихід за межі масиву: "+e);}
}catch(ArithmeticException e){
System.out.println("Ділення на нуль: "+e);}
System.out.println("*******************************");}
}}
11
Вкладені оператори try – Приклад 2
import java.util.Random;
class NestTry2{
ЗАПУСТИТИ
static void nesttry(int a){
try{
if(a==1) a=a/(a-1);
// ділення на нуль
if(a==2){
int c[]={-1};
c[a]=200;
// вихід за межі масиву
}
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("Вихід за межі масиву: "+e);}
}
public static void main(String args[]){
Random r=new Random();
for(int i=1;i<10000;i++){
try{
int a=r.nextInt(3);
// значення 0,1 або 2
int b=100/a;
//можливе ділення на нуль
System.out.println("b="+b);
nesttry(a);
}catch(ArithmeticException e){
System.out.println("Ділення на нуль: "+e);}
System.out.println("*******************************");}
}}
12
Явне викидання виключень
► Розглянуті вище виключення викидались виконавчою
системою Java
► Виключення можна генерувати “вручну”
► Для генерування виключення використовують
оператор throw
► Загальний синтаксис:
throw Throwable-об’єкт або підклас класу Throwable
► Існує 2 способи створення Throwable-об’єкту:
1) використання параметра в операторі catch
2) створення об’єкта за допомогою команди new
► Після оператора throw потік виконання зупиняється і
наступний оператор не виконується. Шукається
відповідний catch- блок для обробки виключення. Інакше
використовується механізм обробки за умовчанням
13
Явне викидання виключень - Приклад
class ThrowDemo{
ЗАПУСТИТИ
static void demoproc(){
try{
throw new NullPointerException(“Помилка!”); // викид виключення
}catch(NullPointerException e){
System.out.println("Перехоплення всередині demoproc!");
throw e;
// повторний викид виключення
}}
public static void main(String args[]){
try{
demoproc();
}catch(NullPointerException e){
System.out.println("Повторне перехоплення: "+e);}}
Всі вбудовані виключення часу виконання мають два конструктори: з
параметром та без. Параметр-рядок визначає опис виключення і друкується
при передачі об’єкту виключення в метод print() чи println()
14
Методи з ключовим словом throws
► Якщо метод може викликати виключення, яке він не обробляє, має
бути передбачений механізм запобігання помилковій ситуації для
зовнішніх методів
► Виключення, що можуть викидатись методом, перераховуються
після ключового слова throws
► Це робиться для ВСІХ виключень, крім:
1) виключень типу Error
2) виключень RuntimeException та їх підкласів
► Загальний синтаксис:
тип метод(аргументи) throws виключення(через кому) {...}
class ThrowsDemo{
static void throwOne() throws IllegalAccessException{
System.out.println("Помилка в методі throwOne!");
throw new IllegalAccessException("Велика помика!");}
public static void main(String args[]){
try{
throwOne();}catch(IllegalAccessException e){
System.out.println("Трапилась неприємність: "+e);}
}}
ЗАПУСТИТИ
15
Вбудовані виключення Java (контрольовані)
Виключення
Пояснення
ArithmeticException
Арифметична помилка (типу ділення на нуль)
ArrayIndexOutOfBoundsException
Індекс масиву за межами припустимої
границі
ArrayStoreException
Призначення елементу масиву
неприпустимого значення
ClassCastException
Неприпустиме приведення типу
IllegalArgumentException
У метод передано неприпустимий аргумент
IndexOutOfBoundsException
Деякий тип індексу знаходиться за межами
границь
NegativeArraySizeException
Створення масиву з від’ємним розміром
NullPointerException
Неприпустиме використання нульового
посилання
NumberFormatException
Неприпустиме перетворення рядка в
числовий формат
StringIndexOutOfBoundsException Спроба індексування за межами рядка
UnsupportedOperationException
Зустрілась неприпустима операція
16
Вбудовані виключення Java (неконтрольовані)
Виключення
Пояснення
ClassNotFoundException
Клас не знайдено
IllegalAccessException
Доступ до класу відхилено
InstantiationException
Спроба створити об’єкт абстрактного класу
чи інтерфейсу
InterruptedException
Один потік перервано іншим потоком
NoSuchFieldException
Поле не існує
NoSuchMethodException
Метод не існує
Контрольовані виключення після ключового слова throws вказувати не
треба.
Неконтрольовані виключення вказуються після ключового слова throws
(якщо вони не обробляються в методі)
17
Створення власних підкласів виключень
► Вбудовані виключення Java охоплюють найбільш загальні помилки
► Можна створювати власні типи виключень. Для цього
визначається підклас класу Exception (а це підклас Throwable).
Цей клас нічого не має реалізовувати.
► Клас Exception не визначає власних методів, а наслідує
методи класу Throwable
Методи класу Throwable
Пояснення
Throwable fillInStackTrace()
Повертає Throwable-об’єкт, що містить
повну трасу стека
String getLocalizesMessage() Повертає локалізований опис
виключення
String getMessage()
Повертає опис виключення
void printStackTrace()
Відображає трасу стека
String toString()
Повертає String-об’єкт, що містить опис
виключення
18
Створення власних підкласів виключень - Приклад
class MyException extends Exception{
private int detail;
MyException(int a){
detail=a;}
public String toString(){
return "Помилкова ситуація: аргумент["+detail+"]";}
}
class MyExceptionDemo{
static void compute(int a) throws MyException{
System.out.println("Метод compute("+a+")");
if(a>10)
throw new MyException(a);
System.out.println("Нормальний вихід з методу!");}
public static void main(String args[]){
try{
compute(1);
compute(20);}catch(MyException e){
System.out.println(e);}
}
}
ЗАПУСТИТИ
19