ЕВ-4791
.pdfcase Lights.ERROR: System.out.println(«Time Error»); break; default: System.out.println(«Unknow light.»); return;
}
}
}
Завдання 2. Композиція для повторного використання коду.
class WaterSource |
{ |
private String s; |
|
WaterSource () { |
|
System.out.println(«WaterSource () «); |
|
s = new String («Зконструьований»); |
|
} |
|
public String toString() {return s;} |
|
} |
|
public class SprinklerSystem { |
|
private String valve1, valve2, valve3, valve4; |
|
WaterSource |
source; |
int i; |
|
float f; |
{ |
void print() |
|
System.out.println(«valve1 = « + valve1); |
|
System.out.println(«valve2 = « + valve2); |
|
System.out.println(«valve3 = « + valve3); |
|
System.out.println(«valve4 = « + valve4); |
|
System.out.println(«i = « + i); |
|
System.out.println(«f = « + f); |
|
System.out.println(«source = « + source); |
|
} |
|
public static void main (String[] args) { |
|
SprinklerSystem x = new SprinklerSystem(); |
|
x.print(); |
|
} |
|
} |
|
Завдання 3. Синтаксис успадкування та його властивості. class Cleanser {
private String s = new String(«Cleanser»); public void append(String a) { append(s += a;}
public void dilute() |
{ append(« |
dilute()»);} |
public void apply() |
{ append(« |
apply()»); } |
public void scrub() |
{ append(« |
scrub()»); } |
public void print() |
{ System.out.println(s) ;} |
|
public static void main (String[] args) { Cleanser x = new Cleanser();
x.dilute(); x. apply(); x. scrub(); x. print();
}
}
public class Detergent extends Cleanser { // Змінюємо метод
public void scrub() { append(«Detergent. scrub()»);
super. scrub(); // Викликаємо метод базового класу
}
// Додаємо нові методи до інтерфейсу public void foam { «foam()»; }
// Перевіряємо новий клас
public static void main (String[] args) { Detergent x = new Detergent ();
51
x.dilute(); x. apply(); x. scrub(); x.foam(); x. print(); System.out.println(«Перевіряємо базовий клас»); Cleanser.main(args);
}
}
Завдання 4. Успадкування та сходження перетворення. class Note {
private int value;
private Note(int val) {value = val;} public static final Note
MIDDLE_C = new Note(0),
C_SARP |
= new Note(1), |
B_FLAT |
= new Note(2); |
}
class Instrument {
public void play(Note n) { System.out.println(«Instrument.play()»);
}
}
class Wind extends Instrument {
//
public void play(Note n) { System.out.println(«Wind.play()»);
}
}
public class Music {
public static void tune(Instrument i) { i.play(Note.MIDDLE_C);
}
public static void main (String[] args) { Wind flute =new Wind();
tune(flute);
}
}
Завдання 5. Поліморфізм.
// Успадкування і восходяще перетворення Файл Music.java
class Note { private int value;
private Note (int val) { value = val; } public static final Note
MIDDLE_C = new None(0),
C_SHARP |
= new Note(1), |
B_FLAT |
= new Note(2); |
}
class Instrument {
public void play(Note n) { System.out.println («Instrumtnt.play()»);
}
}
сlass Wind extends Instrument {
// Перевизначення методу інтерфейсу public void play(Note n) {
System.out.println («Wind.play()»);
}
}
public class Music{
52
public static void tune(Instrument i) { //….
i.play(Note.MIDDLE_C);
}
public static void main (String[] args) { Wind flute = new Wind();
tune(flute); // Восходяще перетворення
}
}
Завдання 6. Перевантаження замість перетворення.
Файл Music2.java class Note {
private int value;
private Note (int val) { value = val; } public static final Note
MIDDLE_C = new None(0),
C_SHARP |
= new Note(1), |
B_FLAT |
= new Note(2); |
}
class Instrument {
public void play(Note n) { System.out.println («Instrumtnt.play()»);
}
}
сlass Wind extends Instrument { public void play(Note n) {
System.out.println («Wind.play()»);
}
}
сlass Stringed extends Instrument { public void play(Note n) {
System.out.println («Stringed.play()»);
}
}
сlass Brass extends Instrument { public void play(Note n) {
System.out.println («Brass.play()»);
}
}
public class Music2{
public static void tune(Wind i) { i.play(Note.MIDDLE_C);
}
public static void tune(Stringed i) { i.play(Note.MIDDLE_C);
}
public static void tune(Brass i) { i.play(Note.MIDDLE_C);
}
public static void main (String[] args) { Wind flute = new Wind();
Stringed violin = new Stringed(); Brass frenchHorn = new Brass();
tune(flute); // Восходяще перетворення відсутнє tune(violin);
tune(frenchHorn);
}
}
53
Завдання 7. Різновиди поліморфізму (Shapes.java).
class Shape { |
{ } |
void draw() |
|
void erase() |
{ } |
}
class Circle extends Shape { void draw() {
System.out.println(«Circle.draw()»);
}
void erase() { System.out.println(«Circle.erase()»);
}
}
class Square extends Shape { void draw() {
System.out.println(«Square.draw()»);
}
void erase() { System.out.println(«Square.erase()»); } }
class Triangle extends Shape { void draw() {
System.out.println(«Triangle.draw()»);
}
void erase() { System.out.println(«Triangle.erase()»);
}
}
public class Shapes {
public static Shape randShape() * 3)) { default:
case 0: return new Circle(); case 1: return new Square(); case 2: return new Triangle();
}
}
public static void main (String[] args) { Shape[] s = new Shape[9];
//Заповнюємо масив фігурами: for (int i = 0; i < s.length; i++)
s[i] = randShape();
//Робимо поліморфні виклики методів: for (int i = 0; i < s.length; i++)
s[i].draw();
}
}
Завдання 8. Розширена програма (Файл Music3.java). import java.util.*;
class Instrument { public void play() {
System.out.println(«Instrument.play()»);
}
public String what() { return «Instrument»;
}
public void adjust() { }
}
class Wind extends Instrument { public void play() {
54
System.out.println(«Wind.play()»);
} |
{ return |
«Wind»;} |
|
public String what() |
|||
public void adjust() |
{ |
} |
|
} |
|
|
|
class Percussion extends Instrument { |
|||
public void play() |
{ |
|
|
System.out.println(«Percussion.play()»); |
|||
} |
{ return |
«Percussion»;} |
|
public String what() |
|||
public void adjust() |
{ |
} |
|
} |
|
|
|
class Stringed extends Instrument { |
|||
public void play() |
{ |
|
|
System.out.println(«Stringed.play()»); |
|||
} |
{ return |
«Stringed»;} |
|
public String what() |
|||
public void adjust() |
{ |
} |
|
} |
|
|
|
class Brass extends Wind { |
|
||
public void play() |
{ |
|
|
System.out.println(«Brass.play()»);
}
public void adjust() { System.out.println(«Brass.adjust()»);
}
}
class Woodwind extends Wind { public void play() {
System.out.println(«Woodwind.play()»);
}
public String what() { return «Woodwind»;}
}
public class Music3{
public static void tune(Instrument i) { i.play();
}
static void tuneAll(Instrument[] e) for (int i = 0; i < s.length; i++)
tune(e[i]);
}
public static void main (String[] args) { Instrument[] orchestra = new Instrument[5]; int i = 0;
//
orchestra[i++] = new Wind(); orchestra[i++] = new Percussion(); orchestra[i++] = new Stringed(); orchestra[i++] = new Brass(); orchestra[i++] = new Woowind(); tuneAll(orchestra);
}
}
Рекомендована література [15; 17; 21].
55
Тема 11. ОПРАЦЮВАННЯ ПОМИЛОК І ВИНЯТКОВИХ СИТУАЦІЙ У ПРОГРАМАХ
Вивчивши матеріал теми, студенти знатимуть:
зовнішні та внутрішні прояви опрацювання помилок;
визначення основних складових винятку;
які параметри використовують при створенні винятку;
технологію опрацювання винятків;
шляхи формування власних винятків;
механізм опису винятків;
процеси перехоплення будь-якого типу винятку. Вивчення матеріалу теми допоможе студенту:
•визначати блоки повторних спроб (try block);
•формувати обробник винятків;
•залучати стандартні винятки Java;
•використовувати RuntimeExeption для автоматичного пошуку помилок;
•закріпляти дії, що завершуються пропозицією finally.
11.1.Навчальні завдання для виконання практичної роботи
Мета роботи: закріпити теоретичні погляди на фундаментальні механізми опрацювання помилок і виняткових ситуацій та визначати їхню практичну сутність.
План
1.Недоліки традиційних методів опрацювання помилок.
2.Характеристика типових ситуацій для виникнення помилок.
3.Підвищення якості програми шляхом опрацювання можливих помилок.
4.Підвищення якості програми за рахунок використання методів опрацювання виняткових ситуацій.
5.Опрацювання помилок з використанням операторів try та throw.
6.Технологія створення блоку try.
7.Характеристика методів, що генерують виняткові ситуації.
11.2.Завдання для опрацювання самостійної роботи
Навчальні завдання
1.Створіть клас з методом main(), який збуджує винятки типу.
2.Exception з блоку try. Задайте в конструкторі Exception рядковий параметр. Перехопіть виняток у пропозиції catch і надрукуйте його текстовий параметр. Додайте пропозицію finally і надрукуйте з нього повідомлення.
3.Створіть власний клас винятку за допомогою ключового слова extends. Напишіть конструктор, який бере рядковий параметр і зберігає його всередині об’єкта через посилання
4.На об’єкт String. Напишіть метод, який друкує цей рядок. Зробіть нову пропозицію trycatch для перевірки нового винятку.
5.Визначте посилання на об’єкт і надайте йому значення null. Cпробуйте викликати метод об’єкта за допомогою цього посилання. Потім вставте цей код у пропозицію try-catch і перехопіть виняток.
6.Створіть клас із двома методами f() і g(). У методі g() збуджуйте виняток того типу, що ви визначили раніше. У методі f() викличте g(), перехопіть виняток і в пропозиції catch збуджуйте новий виняток. Перевірте цей код у методі main().
7.Створіть три нові типи винятків. Напишіть клас із методом, що збуджує всі три. У методі main() викличте цей метод, користуючись однією пропозицією catch, яка може перехопити всі три винятки.
8.Напишіть програму, яка збуджує і перехоплює винятки ArrayIndexOutOfBounds Exception (вихід за межі масиву).
9.Створіть програму, яка використовує модель поновлення за допомогою циклу while. Цикл повторюється, поки виняток збуджується.
56
10.Створіть ієрархію із трьох винятків. Далі створіь базовий клас А з методом, що збуджує винятки і є основою ієрархії. Успадкуйте клас В від А і перевизначте метод так, щоб він збуджував винятки з другого рівня ієрархії. Аналогічно дійте при успадкуванні класу С від В. У методі main() створіть клас С, здійсніть вихідне перетворення до класу А, а потім викличте метод.
11.Продемонструйте, що конструктор успадкованого класу не може перехопити винятки, які збуджуються конструктором базового класу.
12.У завданні 5 додайте пропозицію finally. Переконайтеся, що пропозиція виконується у разі збудження NullPointerException.
11.3.Перелік завдань для відпрацювання індивідуальної роботи
1.Для кожного із завдань пункту 11.2 додати одну із функцій захисту від перелічених помилок:
користувач не задав значення для параметра командного рядка;
файла, ім’я якого вказав користувач, не існує;
системна таблиця файлів виявилася переповненою, тобто в системі одночасно відкрито дуже багато файлів;
процес перевершив кількість файлів, які операційна система дозволяє йому відкрити;
указаний файл існує, але недоступний для читання;
при читанні файла з’ясувалося, що він містить двоїсті, а не текстові дані;
при читанні файла з’ясувалося, що він порожній;
при читанні файла виникла помилка введення-виведення.
2.Виконати наведені приклади та надати висновок стосовно виконання процедур оброблення винятків.
Приклад 1. class ExeDemo1 {
public static void main(String args[]) { int nums[] = new int[4];
// Створення блоку try {
System.out.println(“ Before exception is generated.”); //Спроба звернення за межу масиву
nums [7] = 10;
System.out.println(“ this won’t be displayed”);
}
//Перехоплення винятку…
catch (ArrayIndexOutOfBoundException exc) { System.out.println(“ Index out-of-bounds!”);
}
System.out.println(“ After catch statement.”);
}
}
Приклад 2.
/* Виняток може бути згенерований одним методом, а перехоплений іншим */ class ExeTest {
//Згенерувати виняток static void genException() {
int nums[] = new int[4];
System.out.println(“ Before exception is generated.”);
//Генерація винятку у зв’язку із зверненням за межу масиву nums[7] = 10;
System.out.println(“ this won’t be displayed”);
}
}
class ExeDemo2 {
public static void main(String args[]) {
57
try { ExcTest.genException();
}
//Перехоплення винятку…
catch (ArrayIndexOutOfBoundException exc) { System.out.println(“ Index out-of-bounds!”);
}
System.out.println(“ After catch statement.”);
}
}
Приклад 3.
// Обробка помилки засобами JVM class NotHandled {
public static void main(String args[]) { int nums[] = new int[4];
System.out.println(“ Before exception is generated.”); //Спроба звернення за межу масиву
nums[7] = 10;
}
}
Приклад 4.
//Вишукана обробка винятку і продовження виконання //програми class ExeDemo3 {
public static void main(String args[]) { int numer[] = {4, 8, 16, 32, 64, 128}; int denom[] = {2, 0, 4, 4, 0, 8};
for(int i=0; i<numer.length; i++) { try {
System.out.println(numer[i] + “ / ” + denom[i] + “ is “ + numer[i]/denom[i]);
}
catch (ArithmeticException exc) { System.out.println(“Can’t divide by Zero!”);
}
}
}
}
Приклад 5.
//Використання декількох операторів catch class ExeDemo4 {
public static void main(String args[]) {
int numer[] = {4, 8, 16, 32, 64, 128, 256, 512}; int denom[] = {2, 0, 4, 4, 0, 8};
for(int i=0; i<numer.length; i++) { try {
System.out.println(numer[i] + “ / ” + denom[i] + “ is “ + numer[i]/denom[i]);
}
catch (ArithmeticException exc) { //Перехопити виняток
System.out.println(“Can’t divide by Zero!”);
}
58
catch (ArrayIndexOutOfBoundException exc) { //Перехопити виняток
System.out.println(“ No matching element found.”);
}
}
}
}
Приклад 6.
//В операторах catch винятки типу підкласу повинні передувати //виняткам типу
суперкласу
class ExeDemo5 {
public static void main(String args[]) {
int numer[] = {4, 8, 16, 32, 64, 128, 256, 512}; int denom[] = {2, 0, 4, 4, 0, 8};
for(int i=0; i<numer.length; i++) { try {
System.out.println(numer[i] + “ / ” + denom[i] + “ is “ + numer[i]/denom[i]);
}
//Перехоплення винятку від підкласу catch (ArrayIndexOutOfBoundException exc) {
System.out.println(“ No matching element found.”);
}
//Перехоплення винятку від суперкласу catch (Throwable exc) {
System.out.println(“Some exception occurred.”);
}
}
}
}
Приклад 7.
//Використання вкладених блоків try class NestTrys {
public static void main(String args[]) {
int numer[] = {4, 8, 16, 32, 64, 128, 256, 512}; int denom[] = {2, 0, 4, 4, 0, 8};
try {
for(int i=0; i<numer.length; i++) { try {
System.out.println(numer[i] + “ / ” + denom[i] + “ is “ + numer[i]/denom[i]);
}
catch (ArithmeticException exc) { //Перехопити виняток
System.out.println(“Can’t divide by Zero!”);
}
}
}
catch (ArrayIndexOutOfBoundException exc) { //Перехопити виняток
System.out.println(“No matching element found.”); System.out.println(“Fatal error – program terminated.”);
}
}
}
59
Приклад 8.
//Генерування винятку вручну class ThrowDemo {
public static void main(String args[]) { try {
System.out.println(“Before throw.”); // Генерування винятку
throw new ArithmeticException();
}
catch (ArithmeticException exc) { //Перехопити виняток
System.out.println(“Exception caught.”);
}
System.out.println(“After try/catch block.”);
}
}
Приклад 9.
//Повторне генерування винятків class Rethrow {
public static void genException() {
int numer[] = {4, 8, 16, 32, 64, 128, 256, 512}; int denom[] = {2, 0, 4, 4, 0, 8};
for(int i=0; i<numer.length; i++) { try {
System.out.println(numer[i] + “ / ” + denom[i] + “ is “ + numer[i]/denom[i]);
}
catch (ArithmeticException exc) { //Перехопити виняток
System.out.println(“Can’t divide by Zero!”);
}
catch (ArrayIndexOutOfBoundException exc) { //Перехопити виняток
System.out.println(“No matching element found.”); throw exc; // Повторне генерування винятку
}
}
}
}
class RethrowDemo {
public static void main(String args[]) { try {
Rethrow.genException();
}
catch (ArrayIndexOutOfBoundException exc) { //Перехоплення повторно згенерованого винятку
System.out.println(“Fatal error – program terminated.”);
}
}
}
Приклад 10.
//Використання методів з класу Throwable class ExcTest1 {
//Згенерувати виняток
static void genException() {
60
