Вікіпідручник
ukwikibooks
https://uk.wikibooks.org/wiki/%D0%93%D0%BE%D0%BB%D0%BE%D0%B2%D0%BD%D0%B0_%D1%81%D1%82%D0%BE%D1%80%D1%96%D0%BD%D0%BA%D0%B0
MediaWiki 1.39.0-wmf.23
first-letter
Медіа
Спеціальна
Обговорення
Користувач
Обговорення користувача
Вікіпідручник
Обговорення Вікіпідручника
Файл
Обговорення файлу
MediaWiki
Обговорення MediaWiki
Шаблон
Обговорення шаблону
Довідка
Обговорення довідки
Категорія
Обговорення категорії
Полиця
Обговорення полиці
Рецепт
Обговорення рецепта
TimedText
TimedText talk
Модуль
Обговорення модуля
Gadget
Gadget talk
Gadget definition
Gadget definition talk
Освоюємо Java
0
3521
36901
36862
2022-08-06T18:45:58Z
Володимир Груша
985
/* Детальний зміст */
wikitext
text/x-wiki
<div class="infobox" style="float:right; font-size:85%; line-height:130%">
{{Java/Chapters}}
</div>
'''Java''' (вимовляється Джава; у нас інколи Ява) — об'єктно-орієнтована мова програмування, випущена компанією Sun Microsystems у 1995 році як основний компонент платформи Java. Синтаксис мови багато в чому походить від C та C++. Java програми виконуються у середовищі віртуальної машини Java. Java програми компілюються у байткод, який при виконанні інтерпретується віртуальною машиною для конкретної платформи. В 2009 році Sun Microsystems придбала компанія Oracle, яка продовжує розвивати "Джава".
Даний підручник орієнтований на вивчення Java як людьми з мінімальним рівнем знання програмування, так і людей - які хочуть покращити свої знання з певних нюансів мови.
Долучайтесь до доповнення та виправлення даного підручника. детальніше на сторінці [[Обговорення:Освоюємо Java|обговорення]]).
Якщо знайшли помилку або неточність, будь ласка виправте її, або напишіть про неї на сторінці [[Обговорення:Освоюємо Java|обговорення]].
Деякі нюанси мови java, які не включені у підручник, винесено в [[Освоюємо Java/ЧаП|ЧаП]]
Рівень готовності розділів, позначено відповідним квадратиком: [[Файл:00%.svg]] [[Файл:25%.svg]] [[Файл:50%.svg]] [[Файл:75%.svg]] [[Файл:100 percent.svg]]
<br clear="left">
== Детальний зміст ==
<div class="references-small" style="-moz-column-count:2; column-count:2; -webkit-column-count:2;">
# [[Освоюємо Java/Загальний огляд та історія Java|Загальний огляд та історія Java]] [[Файл:75%.png]]
# [[Освоюємо Java/Встановлення і налаштування середовища розробки|Встановлення і налаштування середовища розробки]] [[Файл:100%.png]]
#* [[Освоюємо Java/Встановлення і налаштування середовища розробки#JDK та його встановлення|JDK та його встановлення]]
#* [[Освоюємо Java/Встановлення і налаштування середовища розробки#Привіт світе!|Привіт світе!]]
#* [[Освоюємо Java/Встановлення і налаштування середовища розробки#Середовище розробки|Середовище розробки]]
#* [[Освоюємо Java/Встановлення і налаштування середовища розробки#Документація|Документація]]
#[[Освоюємо Java/Основи|Основи]] [[Файл:100%.png]]
#*[[Освоюємо Java/Основи#Коментарі|Коментарі]]
#*[[Освоюємо Java/Основи#Типи даних|Типи даних]]
#*[[Освоюємо Java/Основи#Змінні|Змінні]]
#*[[Освоюємо Java/Основи#Оператори|Оператори]]
# [[Освоюємо Java/Вступ в класи та методи|Вступ в класи та методи]] [[Файл:100 percent.svg]]
#*[[Освоюємо Java/Вступ в класи та методи#Класи|Класи]]
#*[[Освоюємо Java/Вступ в класи та методи#Методи|Методи]]
#*[[Освоюємо Java/Вступ в класи та методи#Конструктори|Конструктори]]
# [[Освоюємо Java/Керування порядком виконання|Керування порядком виконання]] [[Файл:100 percent.svg]]
#*[[Освоюємо Java/Керування порядком виконання#Блоки|Блоки]]
#*[[Освоюємо Java/Керування порядком виконання#Умовні інструкції|Умовні інструкції]]
#*[[Освоюємо Java/Керування порядком виконання#Цикли|Цикли]]
#**[[Освоюємо Java/Керування порядком виконання#Цикл while|Цикл while]]
#**[[Освоюємо Java/Керування порядком виконання#Цикл do/while|Цикл do/while]]
#**[[Освоюємо Java/Керування порядком виконання#Цикл з лічильником for|Цикл з лічильником for]]
#**[[Освоюємо Java/Керування порядком виконання#Цикл «for each»|Цикл «for each»]]
#* [[Освоюємо Java/Керування порядком виконання#Інструкції, що порушують порядок виконання|Інструкції, що порушують порядок виконання]]
#* [[Освоюємо Java/Керування порядком виконання#Множинний вибір (switch)|Множинний вибір (switch)]]
# [[Освоюємо Java/Масиви|Масиви]] [[Файл:100 percent.svg]]
#* [[Освоюємо Java/Масиви#Одновимірні масиви|Одновимірні масиви]]
#* [[Освоюємо Java/Масиви#Багатовимірні масиви|Багатовимірні масиви]]
# [[Освоюємо Java/Рядки|Рядки]] [[Файл:100%.png]]
#* [[Освоюємо Java/Рядки#Спецсимволи|Спецсимволи]]
#* [[Освоюємо Java/Рядки#Конкатенація|Конкатенація]]
#* [[Освоюємо Java/Рядки#Робота з рядками|Робота з рядками]]
#* [[Освоюємо Java/Рядки#Підрядки|Підрядки]]
#* [[Освоюємо Java/Рядки#Порівняння рядків|Порівняння рядків]]
#* [[Освоюємо Java/Рядки#Приведення до типу|Приведення до типу]]
#* [[Освоюємо Java/Рядки#Кодові точки та кодові одиниці|Кодові точки та кодові одиниці]]
#* [[Освоюємо Java/Рядки#String API|String API]]
#* [[Освоюємо Java/Рядки#StringBuilder|StringBuilder]]
# [[Освоюємо Java/Методи|Методи]] [[Файл:100%.png]]
#* [[Освоюємо Java/Методи#Перевантаження методів|Перевантаження методів]]
#* [[Освоюємо Java/Методи#Заміщення методів|Заміщення методів]]
# [[Освоюємо Java/Об'єкти і класи|Об'єкти і класи]] [[Файл:75%.png]]
#* [[Освоюємо Java/Об'єкти і класи#Парадигма ООП|Парадигма ООП]]
#* [[Освоюємо Java/Об'єкти і класи#Об'єкти та об'єктні змінні|Об'єкти та об'єктні змінні]]
#* [[Освоюємо Java/Об'єкти і класи#Пакети|Пакети]]
#* [[Освоюємо Java/Об'єкти і класи#Інкапсуляція|Інкапсуляція]]
#* [[Освоюємо Java/Об'єкти і класи#Успадкування|Успадкування]]
#* [[Освоюємо Java/Об'єкти і класи#Поліморфізм|Поліморфізм]]
#* [[Освоюємо Java/Об'єкти і класи#Абстрактні класи|Абстрактні класи]]
#* [[Освоюємо Java/Об'єкти і класи#Інтерфейси|Інтерфейси]]
# [[Освоюємо Java/Винятки|Винятки]] [[Файл:75%.png]]
#* [[Освоюємо Java/Винятки#Винятки в java|Винятки в java]]
#* [[Освоюємо Java/Винятки#Типи винятків|Типи винятків]]
#* [[Освоюємо Java/Винятки#Конструкція try|Конструкція try]]
#* [[Освоюємо Java/Винятки#Throw|Throw]]
#* [[Освоюємо Java/Винятки#Throws|Throws]]
#* [[Освоюємо Java/Винятки#Створення власних винятків|Створення власних винятків]]
# [[Освоюємо Java/Графічний інтерфейс користувача|Графічний інтерфейс користувача]] [[Файл:50%.png]]
#* Робота з графікою (Swing та AWT)
#** Створення фреймів (вікон)
#** Робота з фреймами
#* Обробка подій
# [[Освоюємо Java/Аплети|Аплети]] [[Файл:100%.png]]
# [[Освоюємо Java/Колекції|Колекції]] [[Файл:50%.png]]
#* [[Освоюємо Java/Колекції#Реалізації інтерфейсу Collection|Інтерфейс Collection]]
#** [[Освоюємо Java/Колекції#Клас ArrayList та використання ітератора|Клас ArrayList]]
#** [[Освоюємо Java/Колекції#Клас LinkedList|Клас LinkedList]]
#** [[Освоюємо Java/Колекції#Клас HashSet|Клас HashSet]]
#** [[Освоюємо Java/Колекції#Клас LinkedHashSet|Клас LinkedHashSet]]
#** [[Освоюємо Java/Колекції#Клас TreeSet|Клас TreeSet]]
#** [[Освоюємо Java/Колекції#Клас PriorityQueue|Клас PriorityQueue]]
#** [[Освоюємо Java/Колекції#Клас ArrayDeque|Клас ArrayDeque]]
#* [[Освоюємо Java/Колекції#Інтерфейс Map та класи, що його реалізують|Інтерфейс Map]]
#** [[Освоюємо Java/Колекції#Клас HashMap|Клас HashMap]]
#** [[Освоюємо Java/Колекції#Клас TreeMap|Клас TreeMap]]
#** [[Освоюємо Java/Колекції#Клас LinkedHashMap|Клас LinkedHashMap]]
# [[Освоюємо Java/Менеджери розташування|Менеджери розташування]] [[Файл:100%.png]]
#* [[Освоюємо Java/Менеджери розташування#FlowLayout|FlowLayout]]
#* [[Освоюємо Java/Менеджери розташування#BorderLayout|BorderLayout]]
#* [[Освоюємо Java/Менеджери розташування#GridLayout|GridLayout]]
#* [[Освоюємо Java/Менеджери розташування#BoxLayout|BoxLayout]]
#* [[Освоюємо Java/Менеджери розташування#CardLayout|CardLayout]]
#* [[Освоюємо Java/Менеджери розташування#GridBagLayout|GridBagLayout]]
#* [[Освоюємо Java/Менеджери розташування#Абсолютне позиціонування|Абсолютне позиціонування]]
# [[Освоюємо Java/Графічні компоненти Swing|Графічні компоненти Swing]] [[Файл:25%.png]]
# [[Освоюємо Java/Потоки вводу-виводу|Потоки вводу/виводу]] [[Файл:25%.svg]]
# [[Освоюємо Java/Узагальнення|Узагальнення]] [[Файл:25%.png]]
# [[Освоюємо Java/Паралелізм|Паралелізм]] [[Файл:00%.png]]
# Серіалізація [[Файл:00%.png]]
# Лямда-вирази [[Файл:00%.png]]
</div>
'''Література'''
* Програмування мовою Java / Олексій Васильєв. - Навчальна книга Богдан. 2020. 696 с.
* Core Java. Volume I, Fundamentals (11th edition) / Cay S. Horstmann. — Pearson. 2018
* Java: The Complete Reference, Eleventh Edition /Herbert Schildt. - Oracle Press. 2019. - 1871 p.
* Learning Java 5th Edition/ Marc Loy, Patrick Niemeyer, Daniel Leuck. - O'Reilly Media. 2020 - 1248 p.
'''Корисні лінки'''
* [http://easy-code.com.ua/2011/04/visim-mifiv-pro-java/ Вісім міфів про Java //EasyCode - статті, що стосуються програмування українською]
* [http://leepoint.net/notes-java/index.html Java Notes - детальний англомовний ресурс]
* [http://ukrtechlibrary.wordpress.com/category/%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d1%83%d0%b2%d0%b0%d0%bd%d0%bd%d1%8f/java/ Підручники Java українською]
* [http://www.java2s.com/ Приклади програм та документація по Java. (англ)]
* [http://ukr-technologies.blogspot.com/ Матеріали по Java]
* [ftp://inethub.olvi.net.ua/pub/KPI/Selena/Method/1%20course/Object-Oriented%20Analysis%20and%20Programming/Labs_ua/Index.htm Основи програмування та алгоритмічні мови]
* [http://idndist.lp.edu.ua/moodle/library/books/0021/index_.html Об'єктно-орієнтоване програмування в Java (курс лекцій)]
* [https://www.youtube.com/watch?v=RfVNoetxxHA&list=PLxxPga8YS0l7Bory4_a9RHhg7NAQiCyrq Відеоуроки Java українською//Віртуальна Академія]
* [https://java.happycodings.com/ Java Programming Example Codes]
'''Дивіться також на Вікіпідручнику'''
* [[Функціональне програмування на Java]]
* [[Веб-програмування на Java]]
[[Категорія:Освоюємо Java]]
[[Категорія:Java]]
[[Категорія:Мови програмування]]
[[Категорія:Підручники, близькі до завершення]]
[[cs:Kurz programování v Javě]]
[[de:Java Standard]]
[[en:Java Programming]]
[[es:Programación en Java]]
[[fr:Programmation Java]]
[[it:Java]]
[[hu:Java Programozás]]
[[ka:Java]]
[[nl:Programmeren in Java]]
[[pl:Java]]
[[pt:Java]]
[[ru:Java]]
eyjv3jjntg1krvrndeqjz6wsa00dsl0
36902
36901
2022-08-06T18:52:22Z
Володимир Груша
985
/* Детальний зміст */
wikitext
text/x-wiki
<div class="infobox" style="float:right; font-size:85%; line-height:130%">
{{Java/Chapters}}
</div>
'''Java''' (вимовляється Джава; у нас інколи Ява) — об'єктно-орієнтована мова програмування, випущена компанією Sun Microsystems у 1995 році як основний компонент платформи Java. Синтаксис мови багато в чому походить від C та C++. Java програми виконуються у середовищі віртуальної машини Java. Java програми компілюються у байткод, який при виконанні інтерпретується віртуальною машиною для конкретної платформи. В 2009 році Sun Microsystems придбала компанія Oracle, яка продовжує розвивати "Джава".
Даний підручник орієнтований на вивчення Java як людьми з мінімальним рівнем знання програмування, так і людей - які хочуть покращити свої знання з певних нюансів мови.
Долучайтесь до доповнення та виправлення даного підручника. детальніше на сторінці [[Обговорення:Освоюємо Java|обговорення]]).
Якщо знайшли помилку або неточність, будь ласка виправте її, або напишіть про неї на сторінці [[Обговорення:Освоюємо Java|обговорення]].
Деякі нюанси мови java, які не включені у підручник, винесено в [[Освоюємо Java/ЧаП|ЧаП]]
Рівень готовності розділів, позначено відповідним квадратиком: [[Файл:00%.svg]] [[Файл:25%.svg]] [[Файл:50%.svg]] [[Файл:75%.svg]] [[Файл:100 percent.svg]]
<br clear="left">
== Детальний зміст ==
<div class="references-small" style="-moz-column-count:2; column-count:2; -webkit-column-count:2;">
# [[Освоюємо Java/Загальний огляд та історія Java|Загальний огляд та історія Java]] [[Файл:75%.png]]
# [[Освоюємо Java/Встановлення і налаштування середовища розробки|Встановлення і налаштування середовища розробки]] [[Файл:100%.png]]
#* [[Освоюємо Java/Встановлення і налаштування середовища розробки#JDK та його встановлення|JDK та його встановлення]]
#* [[Освоюємо Java/Встановлення і налаштування середовища розробки#Привіт світе!|Привіт світе!]]
#* [[Освоюємо Java/Встановлення і налаштування середовища розробки#Середовище розробки|Середовище розробки]]
#* [[Освоюємо Java/Встановлення і налаштування середовища розробки#Документація|Документація]]
#[[Освоюємо Java/Основи|Основи]] [[Файл:100%.png]]
#*[[Освоюємо Java/Основи#Коментарі|Коментарі]]
#*[[Освоюємо Java/Основи#Типи даних|Типи даних]]
#*[[Освоюємо Java/Основи#Змінні|Змінні]]
#*[[Освоюємо Java/Основи#Оператори|Оператори]]
# [[Освоюємо Java/Вступ в класи та методи|Вступ в класи та методи]] [[Файл:100 percent.svg]]
#*[[Освоюємо Java/Вступ в класи та методи#Класи|Класи]]
#*[[Освоюємо Java/Вступ в класи та методи#Методи|Методи]]
#*[[Освоюємо Java/Вступ в класи та методи#Конструктори|Конструктори]]
# [[Освоюємо Java/Керування порядком виконання|Керування порядком виконання]] [[Файл:100 percent.svg]]
#*[[Освоюємо Java/Керування порядком виконання#Блоки|Блоки]]
#*[[Освоюємо Java/Керування порядком виконання#Умовні інструкції|Умовні інструкції]]
#*[[Освоюємо Java/Керування порядком виконання#Цикли|Цикли]]
#**[[Освоюємо Java/Керування порядком виконання#Цикл while|Цикл while]]
#**[[Освоюємо Java/Керування порядком виконання#Цикл do/while|Цикл do/while]]
#**[[Освоюємо Java/Керування порядком виконання#Цикл з лічильником for|Цикл з лічильником for]]
#**[[Освоюємо Java/Керування порядком виконання#Цикл «for each»|Цикл «for each»]]
#* [[Освоюємо Java/Керування порядком виконання#Інструкції, що порушують порядок виконання|Інструкції, що порушують порядок виконання]]
#* [[Освоюємо Java/Керування порядком виконання#Множинний вибір (switch)|Множинний вибір (switch)]]
# [[Освоюємо Java/Масиви|Масиви]] [[Файл:100 percent.svg]]
#* [[Освоюємо Java/Масиви#Одновимірні масиви|Одновимірні масиви]]
#* [[Освоюємо Java/Масиви#Багатовимірні масиви|Багатовимірні масиви]]
# [[Освоюємо Java/Рядки|Рядки]] [[Файл:100%.png]]
#* [[Освоюємо Java/Рядки#Спецсимволи|Спецсимволи]]
#* [[Освоюємо Java/Рядки#Конкатенація|Конкатенація]]
#* [[Освоюємо Java/Рядки#Робота з рядками|Робота з рядками]]
#* [[Освоюємо Java/Рядки#Підрядки|Підрядки]]
#* [[Освоюємо Java/Рядки#Порівняння рядків|Порівняння рядків]]
#* [[Освоюємо Java/Рядки#Приведення до типу|Приведення до типу]]
#* [[Освоюємо Java/Рядки#Кодові точки та кодові одиниці|Кодові точки та кодові одиниці]]
#* [[Освоюємо Java/Рядки#String API|String API]]
#* [[Освоюємо Java/Рядки#StringBuilder|StringBuilder]]
# [[Освоюємо Java/Методи|Методи]] [[Файл:100%.png]]
#* [[Освоюємо Java/Методи#Перевантаження методів|Перевантаження методів]]
#* [[Освоюємо Java/Методи#Заміщення методів|Заміщення методів]]
# [[Освоюємо Java/Об'єкти і класи|Об'єкти і класи]] [[Файл:75%.png]]
#* [[Освоюємо Java/Об'єкти і класи#Парадигма ООП|Парадигма ООП]]
#* [[Освоюємо Java/Об'єкти і класи#Об'єкти та об'єктні змінні|Об'єкти та об'єктні змінні]]
#* [[Освоюємо Java/Об'єкти і класи#Пакети|Пакети]]
#* [[Освоюємо Java/Об'єкти і класи#Інкапсуляція|Інкапсуляція]]
#* [[Освоюємо Java/Об'єкти і класи#Успадкування|Успадкування]]
#* [[Освоюємо Java/Об'єкти і класи#Поліморфізм|Поліморфізм]]
#* [[Освоюємо Java/Об'єкти і класи#Абстрактні класи|Абстрактні класи]]
#* [[Освоюємо Java/Об'єкти і класи#Інтерфейси|Інтерфейси]]
# [[Освоюємо Java/Винятки|Винятки]] [[Файл:75%.png]]
#* [[Освоюємо Java/Винятки#Винятки в java|Винятки в java]]
#* [[Освоюємо Java/Винятки#Типи винятків|Типи винятків]]
#* [[Освоюємо Java/Винятки#Конструкція try|Конструкція try]]
#** [[Освоюємо Java/Винятки#try з ресурсами|try з ресурсами]]
#* [[Освоюємо Java/Винятки#Throw|Throw]]
#* [[Освоюємо Java/Винятки#Throws|Throws]]
#* [[Освоюємо Java/Винятки#Створення власних винятків|Створення власних винятків]]
# [[Освоюємо Java/Графічний інтерфейс користувача|Графічний інтерфейс користувача]] [[Файл:50%.png]]
#* Робота з графікою (Swing та AWT)
#** Створення фреймів (вікон)
#** Робота з фреймами
#* Обробка подій
# [[Освоюємо Java/Аплети|Аплети]] [[Файл:100%.png]]
# [[Освоюємо Java/Колекції|Колекції]] [[Файл:50%.png]]
#* [[Освоюємо Java/Колекції#Реалізації інтерфейсу Collection|Інтерфейс Collection]]
#** [[Освоюємо Java/Колекції#Клас ArrayList та використання ітератора|Клас ArrayList]]
#** [[Освоюємо Java/Колекції#Клас LinkedList|Клас LinkedList]]
#** [[Освоюємо Java/Колекції#Клас HashSet|Клас HashSet]]
#** [[Освоюємо Java/Колекції#Клас LinkedHashSet|Клас LinkedHashSet]]
#** [[Освоюємо Java/Колекції#Клас TreeSet|Клас TreeSet]]
#** [[Освоюємо Java/Колекції#Клас PriorityQueue|Клас PriorityQueue]]
#** [[Освоюємо Java/Колекції#Клас ArrayDeque|Клас ArrayDeque]]
#* [[Освоюємо Java/Колекції#Інтерфейс Map та класи, що його реалізують|Інтерфейс Map]]
#** [[Освоюємо Java/Колекції#Клас HashMap|Клас HashMap]]
#** [[Освоюємо Java/Колекції#Клас TreeMap|Клас TreeMap]]
#** [[Освоюємо Java/Колекції#Клас LinkedHashMap|Клас LinkedHashMap]]
# [[Освоюємо Java/Менеджери розташування|Менеджери розташування]] [[Файл:100%.png]]
#* [[Освоюємо Java/Менеджери розташування#FlowLayout|FlowLayout]]
#* [[Освоюємо Java/Менеджери розташування#BorderLayout|BorderLayout]]
#* [[Освоюємо Java/Менеджери розташування#GridLayout|GridLayout]]
#* [[Освоюємо Java/Менеджери розташування#BoxLayout|BoxLayout]]
#* [[Освоюємо Java/Менеджери розташування#CardLayout|CardLayout]]
#* [[Освоюємо Java/Менеджери розташування#GridBagLayout|GridBagLayout]]
#* [[Освоюємо Java/Менеджери розташування#Абсолютне позиціонування|Абсолютне позиціонування]]
# [[Освоюємо Java/Графічні компоненти Swing|Графічні компоненти Swing]] [[Файл:25%.png]]
# [[Освоюємо Java/Потоки вводу-виводу|Потоки вводу/виводу]] [[Файл:25%.svg]]
# [[Освоюємо Java/Узагальнення|Узагальнення]] [[Файл:25%.png]]
# [[Освоюємо Java/Паралелізм|Паралелізм]] [[Файл:00%.png]]
# Серіалізація [[Файл:00%.png]]
# Лямда-вирази [[Файл:00%.png]]
</div>
'''Література'''
* Програмування мовою Java / Олексій Васильєв. - Навчальна книга Богдан. 2020. 696 с.
* Core Java. Volume I, Fundamentals (11th edition) / Cay S. Horstmann. — Pearson. 2018
* Java: The Complete Reference, Eleventh Edition /Herbert Schildt. - Oracle Press. 2019. - 1871 p.
* Learning Java 5th Edition/ Marc Loy, Patrick Niemeyer, Daniel Leuck. - O'Reilly Media. 2020 - 1248 p.
'''Корисні лінки'''
* [http://easy-code.com.ua/2011/04/visim-mifiv-pro-java/ Вісім міфів про Java //EasyCode - статті, що стосуються програмування українською]
* [http://leepoint.net/notes-java/index.html Java Notes - детальний англомовний ресурс]
* [http://ukrtechlibrary.wordpress.com/category/%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d1%83%d0%b2%d0%b0%d0%bd%d0%bd%d1%8f/java/ Підручники Java українською]
* [http://www.java2s.com/ Приклади програм та документація по Java. (англ)]
* [http://ukr-technologies.blogspot.com/ Матеріали по Java]
* [ftp://inethub.olvi.net.ua/pub/KPI/Selena/Method/1%20course/Object-Oriented%20Analysis%20and%20Programming/Labs_ua/Index.htm Основи програмування та алгоритмічні мови]
* [http://idndist.lp.edu.ua/moodle/library/books/0021/index_.html Об'єктно-орієнтоване програмування в Java (курс лекцій)]
* [https://www.youtube.com/watch?v=RfVNoetxxHA&list=PLxxPga8YS0l7Bory4_a9RHhg7NAQiCyrq Відеоуроки Java українською//Віртуальна Академія]
* [https://java.happycodings.com/ Java Programming Example Codes]
'''Дивіться також на Вікіпідручнику'''
* [[Функціональне програмування на Java]]
* [[Веб-програмування на Java]]
[[Категорія:Освоюємо Java]]
[[Категорія:Java]]
[[Категорія:Мови програмування]]
[[Категорія:Підручники, близькі до завершення]]
[[cs:Kurz programování v Javě]]
[[de:Java Standard]]
[[en:Java Programming]]
[[es:Programación en Java]]
[[fr:Programmation Java]]
[[it:Java]]
[[hu:Java Programozás]]
[[ka:Java]]
[[nl:Programmeren in Java]]
[[pl:Java]]
[[pt:Java]]
[[ru:Java]]
k5y3z5wlrglk1avisv0glnkttm47e9f
Користувач:Володимир Груша
2
3526
36893
33528
2022-08-06T15:49:46Z
Володимир Груша
985
wikitext
text/x-wiki
<div class="references-small" style="-moz-column-count:2; column-count:2; -webkit-column-count:2;">
Працюю над:
*[[Освоюємо Java]]
*[[Освоюємо R]]
*[[Веб-програмування на Java]]
*[[Освоюємо Kotlin]]
*[https://ukr-technologies.blogspot.com ІТ блог]
Всі [http://meta.wikimedia.org/wiki/List_of_Wikibooks ВікіПідручники]
* 2010-09-05 - ми '''44'''
* 2010-11-14 - ми '''42'''
* 2020-04-17 - ми '''36'''
http://leepoint.net/notes-java/index.html
Статистика вікіпідручника:
* http://uk.wikibooks.org/wiki/Спеціальна:Statistics
* [https://tools.wmflabs.org/pageviews/?project=uk.wikibooks.org&platform=all-access&agent=user&redirects=0&start=2015-07&end=2022-02&pages=%D0%9E%D1%81%D0%B2%D0%BE%D1%8E%D1%94%D0%BC%D0%BE_Java| Освоюємо Java]
*[https://tools.wmflabs.org/pageviews/?project=uk.wikibooks.org&platform=all-access&agent=user&redirects=0&start=2015-07&end=2020-02&pages=%D0%92%D0%B5%D0%B1-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F_%D0%BD%D0%B0_Java| Веб програмування на Java]
* http://en.wikibooks.org/wiki/Wikibooks:Statistics - загальна
</div>
67wubo7xy4q45zl69jcb7cs2nqjdyaa
Освоюємо Java/Вступ в класи та методи
0
4305
36894
30904
2022-08-06T15:58:17Z
Володимир Груша
985
wikitext
text/x-wiki
==Класи==
'''Класи''' – це конструкції спеціального виду, які дозволяють об’єднати ряд змінних різних типів в одне ціле. Крім власне даних, класи зазвичай включають підпрограми (в термінології java - методи) і можуть включати блоки (сукупність інструкцій між фігурними дужками {}) та інші класи (внутрішні класи). Таким чином утворюються нові типи даних.
Роз’яснення принципів побудови і роботи з класами доволі громіздка тема, тому тут розглянемо лише спрощені основи їх роботи і створення. Детальніше дивіться розділ присвячений [[Освоюємо Java/Об'єкти і класи|об'єктам і класам]]. Розглянути зараз необхідно через те, що Java повністю об’єктно-орієнтована мова. З класами та пов’язаними з ними методами ви зіштовхуватиметися на кожному кроці. Зокрема, навіть виведення даних System.out.println(); - здійснюється за допомогою класу System та методу println().
Для прикладу розглянемо наступну задачу: ''«Ви фанат збору 1 гривневих монет:). Назбирали їх чимало і хочете купити для своєї колекції невеличкий сейф та вбудувати цей сейф у стіну, щоб його з вашою колекцією не вкрали:). В інтернет-магазині вказані розміри сейфу. Постає питання, який же сейф вибрати? Оскільки сейф не один, то щоб не розраховувати вручну кожного разу об'єм сейфу, Ви захотіли написати відповідну програму.»''
І так маємо:
<syntaxhighlight lang="java">
/**
* CoinVolume.java
*/
public class CoinVolume {
public static void main(String[] args) {
double width1 = 10, height1 = 15, depth1 = 20;
double width2 = 15, height2 = 20, depth2 = 15;
double width3 = 15, height3 = 25, depth3 = 15;
int cointAmount = 15000; //кількість монет - непогано зібрав :)
double coinVolume = 2 * 2 * 0.1; //приблизний об'єм монети=2*діаметр*товщину
double safeVolume1;
double safeVolume2;
double safeVolume3;
double totalCoinVol;
totalCoinVol = cointAmount * coinVolume; // заг. об'єм, який займають монети
safeVolume1 = width1 * height1 * depth1; //об'єм першого сейфу
safeVolume2 = width2 * height2 * depth2; //об'єм другого сейфу
safeVolume3 = width3 * height3 * depth3; //об'єм третього сейфу
System.out.println("Об'єм 1-го сейфу=" + safeVolume1);
System.out.println("Об'єм 2-го сейфу=" + safeVolume2);
System.out.println("Об'єм 3-го сейфу=" + safeVolume3);
System.out.println("Загальний об'єм монет=" + totalCoinVol);
}
}
</syntaxhighlight>
Результат виконання:
<pre>
Об'єм 1-го сейфу=3000.0
Об'єм 2-го сейфу=4500.0
Об'єм 3-го сейфу=5625.0
Загальний об'єм монет=6000.0
</pre>
Як бачимо з трьох сейфів не підійшов жоден, потрібен більший. Проте додавання кожного нового сейфу вимагає дописування великої кількості інструкцій. Потрібно оголошувати три змінні для довжини, ширини та глибини сейфу, також потрібна змінна для об’єму, інструкція обчислення та виведення на екран результатів. Звичайно, можна оцінювати по одному, змінюючи значення змінних (полів даних), але тоді доведеться кожного разу перекомпільовувати і запускати програму, що не дуже зручно, коли сейфів близько ста. А якщо ви захочете ще раз оцінити розміри деяких сейфів, доведеться виконувати роботу ще раз. Ось тут в пригоді і стане нам клас Safe. Зверніть увагу, що назва класу пишеться з великої літери. Рекомендовано давати назви класів з великої літери. Таким чином дуже просто розрізнити його від інших складових програми, наприклад назву класу від назви змінної, яку прийнято писати з маленької літери.
Оголосити найпростіший клас можна так:
<syntaxhighlight lang="java">
class Safe
{
double width;
double height;
double depth;
double safeVolume;
}
</syntaxhighlight>
Для його оголошення використовується ключове слово class та назва класу, далі іде тіло класу у фігурних дужках {}. Проте, хоч клас існує, ми не можемо так просто його використовувати. Ми повинні спочатку створити екземпляр даного класу (об’єкт). Для цього необхідно написати наступну інструкцію:
<syntaxhighlight lang="java">
Safe mySafe1 = new Safe();
</syntaxhighlight>
де Safe – назва класу, mySafe – назва об'єктної змінної, яка посилатиметься на наш екземпляр класу (об'єкт типу Safe), new Safe() – створює об’єкт(при цьому відбувається виділення пам’яті під об’єкт). Таким чином ми створили перший сейф. Щоб створити другий сейф використовується аналогічна інструкція:
<syntaxhighlight lang="java">
Safe mySafe2 = new Safe(); //як бачимо змінилась лише назва змінної
</syntaxhighlight>
Інколи класи порівнюють з формочкою для випічки печива, а саме печиво – це уже конкретний створений екземпляр (об’єкт). Форма може бути одна, а печива на її основі можна зробити безліч із різною начинкою. Так само і з класом – це шаблон, а на його основі можемо створити безліч екземплярів даного класу.
Проте як же ми можемо звернутися до полів об’єкту (змінних всередині об'єкту)? Для цього використовується операція «.»(крапка), а сама інструкція звернення записується в такій формі - назваОб’єкту.змінна:
<syntaxhighlight lang="java">
mySafe1.width = 10;
</syntaxhighlight>
Перепишемо нашу програму з використанням класу Safe:
<syntaxhighlight lang="java">
class Safe {
double width = 0;
double height = 0;
double depth = 0;
double safeVolume = 0; //додамо змінну, в якій зберігатиметься об'єм сейфу
}
public class CoinVolume {
public static void main(String[] args) {
//створюємо перший сейф
Safe mySafe1 = new Safe();
//вказуємо його розміри
mySafe1.width = 10;
mySafe1.height = 15;
mySafe1.depth = 20;
//обчислюємо об'єм сейфу
mySafe1.safeVolume = mySafe1.width * mySafe1.height * mySafe1.depth;
//аналогічно для другого сейфу
Safe mySafe2 = new Safe();
mySafe2.width = 15;
mySafe2.height = 20;
mySafe2.depth = 15;
mySafe2.safeVolume = mySafe2.width * mySafe2.height * mySafe2.depth;
//виводимо на консоль об'єми сейфів
System.out.println("Об'єм 1-го сейфу=" + mySafe1.safeVolume);
System.out.println("Об'єм 2-го сейфу=" + mySafe2.safeVolume);
}
}
</syntaxhighlight>
Щоб зосередитись на основному, з програми усунено обчислення об’єму монети. Компіляцію програми здійснюємо аналогічно до попередньої, за назвою класу в якому знаходиться метод main()— javac CoinVolume.java. Клас Safe не обов'язково може бути в одному і тому ж файлі, що і клас CoinVolume.
Отже клас ми додали, проте тепер програма виглядає складнішою ніж попередній варіант. Ситуацію виправити може використання методів.
==Методи==
Методи в java – це аналог підпрограм, функцій, процедур в інших мовах програмування. За допомогою методів ми виносимо текст повторюваного коду програми окремо в тіло методу, після чого можна викликати даний метод з будь-якого місця програми, безліч разів.
Спрощене оголошення та визначення методу, який ми зараз будемо використовувати, має вигляд:
<pre>
тип_повернення назва_методу(параметри){
//тіло методу;
інструкція1;
інструкція2;
…..
інструкціяN;
}</pre>
Тип_повернення – результат виконання методу, наприклад він може повертати об’єм сейфу, тоді тип_повернення буде double. Якщо метод нічого не повертає, то вказується слово ключове слово void.
Виклик методу здійснює наступна інструкція: <code>назва_методу(параметри)</code>. Взагалі в термінології мов програмування для виклику методу використовуються аргументи, а в самому методі – це уже параметри, оскільки передаються лише значення змінних, а не самі змінні. Аргументи та параметри повинні бути одного і того ж типу. Якщо ми передаємо цілочисельне значення, то і параметр повинен бути цілочисельним і т.п. Тобто в методі створюються нові змінні. В деяких мовах, наприклад в С++, як аргумент можна передати посилання на певну змінну, таким чином її можна буде модифікувати в функції через вказівник на дану змінну. В Java в метод передаються лише значення змінних, тому розрізнення аргументів і параметрів менш суттєве і ми там і там використовуватимемо термін «параметр». Об'єкти ж в методи передаються по посиланню. Тобто, при передачі в якості аргументу об'єкта, буде передане посилання на об'єкт, а не створений новий об'єкт.
Повернемось до нашої програми. Повторюваними є присвоювання значень змінним, обчислення та виведення об’ємів. Тому корисно буде створити два методи safeValue (double width, double height, double depth) та safeVolume (). Перший для присвоєння змінним значень, а другий для обчислення об'єму.
Модифікована програма матиме вигляд:
<syntaxhighlight lang="java">
class Safe {
double width = 10; // поля класу можуть бути ініціалізовані з самого початку
double height = 10;
double depth = 10;
double safeVolume = 0;
// метод присвоєння значень змінним
void safeValue(double pWidth, double pHeight, double pDepth) {
width = pWidth;
height = pHeight;
depth = pDepth;
}
// метод для обчислення об'єму сейфа
double safeVolume() {
return width * height * depth;
}
}
public class CoinVolume {
public static void main(String[] args) {
double width1 = 10, height1 = 20, depth1 = 40;
Safe mySafe1 = new Safe(); //створюємо перший сейф
Safe mySafe2 = new Safe(); //створюємо другий сейф
//задаємо розміри сейфу
//викликаємо метод safeValue() класу Safe, що ініціалізує поля об'єкту
mySafe1.safeValue(width1, height1, depth1);
mySafe2.safeValue(10.0, 15.0, 15.5); //можна і так
//виводимо на екран об'єми сейфів
//для чого викликаємо метод safeVolume(), який повертає обчислений об'єм кожного сейфу
System.out.println("Об'єм 1-го сейфу=" + mySafe1.safeVolume());
System.out.println("Об'єм 2-го сейфу=" + mySafe2.safeVolume());
}
}
</syntaxhighlight>
Як бачимо код програми спростився. Тепер набагато легше модифікувати програму, додаючи нові сейфи. Крім того можна, наприклад, вивести повідомлення з інформацією про об’єм, розмістивши його в метод safeVolume() або зовсім в окремий метод, наприклад, printVolume().
Слід зауважити, щодо назв змінних-параметрів. Так для висоти, ширини та глибини в методі safeValue() вибрані назви pWidth, pHeight, pDepth. Вони могли б мати назви і просто width, height, depth, але тоді б вони перекрили доступ до однойменних змінних класу. В такому випадку, щоб звернутися до змінних класу з методу необхідно вживати ключове слово this. Наприклад: <code>this.height=height</code> – тут ми присвоюємо змінній класу this.height одержаний методом параметр height.
==Конструктори==
Замість методу safeValue(), який в нас заповнює змінні об’єкту значеннями ми можемо створити метод, який буде мати назву таку ж як і клас, тобто Safe(pWidth, pHeight, pDepth). Це дасть нам можливість ще скоротити програму, оскільки при створенні об’єкту ми зможемо зразу ж задавати розміри сейфу.
<syntaxhighlight lang="java">
Safe mySafe1 = new Safe(10.0, 15.0, 20.0)
</syntaxhighlight>
Такі методи носять назву “'''конструктор класу'''”. Коли ми писали просто new Safe(); то віртуальна машина використовувала конструктор по замовчуванню без параметрів, який практично нічого корисного для нас не робив. Тепер же ми можемо використовувати новий створений нами конструктор.
Таким чином, новий варіант програми:
<syntaxhighlight lang="java">
class Safe {
double width;
double height;
double depth;
// конструктор
Safe(double pWidth, double pHeight, double pDepth) {
width = pWidth;
height = pHeight;
depth = pDepth;
}
// обчислюємо об'єм сейфу
double getVolume() {
return width * height * depth;
}
}
public class CoinsVolume {
public static void main(String[] args) {
double width1 = 10, height1 = 20, depth1 = 40;
Safe safe1 = new Safe(width1, height1, depth1); // створюємо 1-й сейф
Safe safe2 = new Safe(10.0, 15.0, 20.0); // створюємо 2-й сейф
Safe safe3 = new Safe(10.3, 15.4, 20.5); // створюємо 3-й сейф
Safe safe4 = new Safe(20.0, 30.0, 20.0); // створюємо 4-й сейф
printSafeVolume(safe1, 1); // виводимо об'єм 1-го сейфу
printSafeVolume(safe2, 2); // виводимо об'єм 2-го сейфу
printSafeVolume(safe3, 3); // виводимо об'єм 3-го сейфу
printSafeVolume(safe4, 4); // виводимо об'єм 4-го сейфу
}
// вивід об'єму сейфу
// safe - сейф
// number - номер сейфу
static void printSafeVolume(Safe safe, int number) {
// викликаємо метод getVolume(), що обчислює об’єм сейфу і результат виводимо на екран
System.out.println("Об'єм " + number + "-го сейфу = " + safe.getVolume());
}
}</syntaxhighlight>
Результат виконання:
<pre>
Об'єм 1-го сейфу = 8000.0
Об'єм 2-го сейфу = 3000.0
Об'єм 3-го сейфу = 3251.71
Об'єм 4-го сейфу = 12000.0
</pre>
В наведеному прикладі, щоб обчислити об’єм нового сейфу, нам потрібно додати лише два рядочки тексту (дві інструкції). Щоправда навіть це можна автоматизувати за допомогою використання іншого типу даних – масивів, які будуть розглядатися пізніше. Можна також додати клас Coin, в якому був би метод для обчислення сукупного об’єму різноманітних монет. Ви можете спробувати зробити таку програму зараз. Це буде корисним для засвоєння викладеного матеріалу.
Тема класів та методів значно комплексніша, тому основне, що Ви повинні винести з даного розділу – це розуміння того, як використовуються методи класів. Java надає великий набір уже готових класів та методів, які значно спрощують роботу програміста.
{{Гортання сторінок|Основи|Керування порядком виконання}}
[[Категорія:Освоюємо Java]]
2rn3mk1d76u01gegxnb0cptoft6p7ub
Освоюємо Java/Керування порядком виконання
0
4306
36895
34705
2022-08-06T16:03:12Z
Володимир Груша
985
/* Цикл «for each» */
wikitext
text/x-wiki
Java, як і інші мови програмування, підтримує умовні інструкції та цикли, що визначають порядок виконання інструкцій у програмі. В англійській мові для цього поняття застосовують термін control flow — керування течією.
==Блоки==
Перед тим як знайомитись з керувальними структурами, спочатку необхідно ознайомитися з блоками. Блок або складена інструкція – це будь-яка кількість простих інструкцій, які оточені парою фігурних дужок. Блок визначає область видимості ваших змінних. Блоки можуть бути вкладені в середину інших блоків. Ви вже зустрічалися з блоками при створенні найпростіших програм у методі main(). Наступний приклад демонструє вкладення блоку у блок методу main:
<syntaxhighlight lang="java">
public static void main(String[] args)
{
int n;
. . .
{
int k;
. . .
} // змінна k визначена лише до цього місця
}
</syntaxhighlight>
Проте не можна визначати однакові змінні в двох вкладених блоках (на відміну від С++, де це можливо).
<syntaxhighlight lang="java">
public static void main(String[] args)
{
int n;
. . .
{
int k;
int n; // помилка! – не можна перевизначити n у внутрішньому блоці
. . .
}
}
</syntaxhighlight>
==Умовні інструкції==
<!--необхідно зробити цікавий приклад-->
Умовна інструкція в Java має форму:
<pre>if (умова) інструкція;</pre>
Умова повинна бути оточена дужками і, якщо, умова вірна (true) буде виконана інструкція за умовою, інакше вона не буде виконана, а буде виконана наступна інструкція після умовної інструкції.
Приклад:
<syntaxhighlight lang="java">
int a = 5;
if (a < 100) System.out.println("Число менше ста");
</syntaxhighlight>
Зазвичай, необхідно виконати не одну інструкцію, в такому разі інструкції розміщають у блоці:
<pre>
if (умова){
iнструкція 1;
…..
iнструкція n;
}
</pre>
В такому разі при істинності умови, виконуються усі інструкції у блоці, якщо умова невірна, то виконується наступна інструкція після закриваючої дужки блоку. Якщо ж необхідно здійснити певну дію в разі не виконання умови, то в такому разі застосовують умовну інструкцію наступного виду:
<pre>if (умова) інструкція1; else інструкція2;</pre>
<syntaxhighlight lang="java">
if (yourSales >= target)
{
performance = "Satisfactory";
bonus = 100 + 0.01 * (yourSales - target);
}
else
{
performance = "Unsatisfactory";
bonus = 0;
}
</syntaxhighlight>
Інструкції if можуть іти одна за одною без використання else:
<syntaxhighlight lang="java">
if (x <= 0) if (x == 0) sign = 0; else sign = -1;
</syntaxhighlight>
Для того, щоб програма була більш читабельна бажано застосовувати фігурні дужки:
<syntaxhighlight lang="java">
if (x <= 0) { if (x == 0) sign = 0; else sign = -1; }
</syntaxhighlight>
Вони нічого не змінюють, але вираз стає більш зрозумілим. Інструкція чи блок інструкцій виконується лише в разі виконання усіх умов.
Щоправда дану інструкцію можна також переписати ускладнивши умову використавши булевий оператор і (&&):
<!--Розібратися детальніше-->
<syntaxhighlight lang="java">
If (x <= 0 && x==0) sign = 0; else sign=-1;
</syntaxhighlight>
Можна також використовувати повторюваність інструкцій if….else.
<syntaxhighlight lang="java">
if (yourSales >= 2 * target)
{
performance = "Excellent";
bonus = 1000;
}
else if (yourSales >= 1.5 * target)
{
performance = "Fine";
bonus = 500;
}
else if (yourSales >= target)
{
performance = "Satisfactory";
bonus = 100;
}
else
{
System.out.println("You're fired");
}
</syntaxhighlight>
Це дає можливість перевірити ряд умов, якщо попередні умови не виконуються.
==Цикли==
Цикли – це послідовність інструкцій, які можуть повторно виконуватись певну кількість раз в залежності від заданої в програмі умови. Розрізняють цикли з передумовою, з післяумовою та з лічильником.
===Цикл while===
Цикл while (перекладається як «доки») – це цикл з передумовою, тіло якого (тобто інструкція або блок інструкцій) виконується, якщо умова істинна. Якщо умова з самого початку хибна, то цикл не виконається жодного разу.
Загальний вигляд:
<pre>
while (умова) інструкція;
</pre>
Якщо немає фігурних дужок, то перша інструкція, яка йде після оголошення циклу, вважається тілом циклу. Всі інші інструкції знаходяться поза циклом. Якщо в циклі повинні виконуватись кілька інструкцій, то необхідно використати фігурні дужки. Вони також можуть використовуватись при одній інструкції заради кращого візуального розуміння коду.
<pre>
while (умова){
інструкція 1;
...
інструкція N;
}
</pre>
В наступному прикладі демонструється мінігра із вгадуванням числа від 0 до 10, яка створена з використанням циклу while:
<syntaxhighlight lang=java>
import java.util.*;
public class Game {
public static void main(String[] args) {
Scanner in = new Scanner(System.in); // створюємо сканер для введення даних з консолі
Random generator = new Random(); //створюємо генератор випадкових чисел
System.out.println("Спробуйте відгадати число від 0 до 10");
int gn;
String more = "Y";
while (more.equals("Y") || more.equals("y")) { // поки змінна more рівна “Y” або “y”
gn = generator.nextInt(10); // генерація випадкового числа від 0 до 10;
System.out.print("Введіть число від 0 до 10: ");
int number = in.nextInt(); // зчитуємо число з клавіатури
if (gn == number)
System.out.print("Вгадали!!! Спробуєте ще раз? (Y/N)");
else
System.out.print("Не вгадали. Спробуєте ще раз? (Y/N)");
more = in.next(); // отримати відповідь
}
}
}
</syntaxhighlight>
Результат виконання:
<pre>
Спробуйте відгадати число від 0 до 10
Введіть число від 0 до 10: 6
Не вгадали. Спробуєте ще раз? (Y/N)y
Введіть число від 0 до 10: 7
Вгадали!!! Спробуєте ще раз? (Y/N) n
</pre>
Програма генерує випадкове число при кожному повторі циклу і пропонує вгадати його. Після вводу користувачем числа - виводить відповідне повідомлення вгадано чи ні. Після цього пропонується здійснити нову спробу. Якщо користувач вводить з клавіатури “Y" або “y”, то гра продовжується, якщо введе щось інше, то завершується.
Для генерації випадкових чисел використано клас Random, що містить методи для генерації випадкових чисел. Зокрема, у нашій програмі використано метод nextInt(), який дозволяє генерувати випадкові числа.
Для зчитування з клавіатури використано клас Scanner, який був доданий в java 5.0, для зручного вводу з клавіатури. Метод nextInt() – читає ціле число, next() – читає цілий рядок з клавіатури.
Для того, щоб переконатися, що користувач хоче продовжити гру використано метод equals() з класу String - Strint1.equals (String2), що перевіряє чи один рядок (String1) тексту рівний іншому (String2).
У вищенаведеній програмі пояснення потребують три рядка. Для початку Вам необхідно лише в загальному зрозуміти їхнє призначення.
<noinclude>
<syntaxhighlight lang="java">
import java.util.*;
Random generator = new Random();
gn=generator.nextInt(10);
</syntaxhighlight>
</noinclude>
Нам необхідний генератор цілих чисел, який реалізовує класс Random у пакеті java.util. Для цього ми імпортуємо відповідний клас (в С/С++ аналогом є підключення бібліотеки). Далі в програмі створюємо змінну generator, яка вказуватиме на екземпляр класу random і дозволятиме звернення до методів даного класу. new Random() - створює відповідний об'єкт. Для генерації випадкових чисел ми використовуємо метод nextInt() класу Random.
===Цикл do/while===
Якщо необхідно, щоб умова виконувалася хоча б один раз можна скористатися циклом з післяумовою do/while:
<pre>
do інструкція while (умова);
</pre>
Зокрема, в програмі з вгадуванням чисел, більш логічніше було б застосувати саме даний цикл, оскільки необхідне хоча б одне виконання тіла циклу.
<syntaxhighlight lang=java>
import java.util.*;
public class Tmp {
public static void main(String[] args) {
Scanner in = new Scanner(System.in); // створюємо Сканер для введення даних з консолі
Random generator = new Random(); // створюємо генератор випадкових чисел
System.out.println("Спробуйте відгадати число від 0 до 10");
int gn;
String more;
do {
gn = generator.nextInt(10); //генерація випадкового числа від 0 до 10;
System.out.print("Введіть число від 0 до 10: ");
int number = in.nextInt();
if (gn == number)
System.out.print("Вгадали!!! Спробуєте ще раз? (Y/N)");
else
System.out.print("Не вгадали. Спробуєте ще раз? (Y/N)");
more = in.next();
} while (more.equals("Y") || more.equals("y"));
}
}
</syntaxhighlight>
===Цикл з лічильником for===
Цикл for – доволі часто вживаний цикл. Він застосовується при необхідності виконати інструкції певну кількість раз з одночасним збільшенням або зменшенням певної змінної. Часто використовується для здійснення перебору певних масивів даних, зокрема, також для сортування масивів. Приклад використання:
<syntaxhighlight lang=java>
for (int i = 1; i <= 10; i++) {
System.out.println(i);
}
</syntaxhighlight>
Наведений вище приклад виведе на консолі в стовпчик числа від 1 до 10. Як бачимо в умові циклу перший слот відводиться для ініціалізації змінної, причому оголосити змінну можна і в іншому місці. Другий слот – для умови, яка перевіряється перед виконанням ітерації, третій слот – вказує як модифікувати змінну-лічильник. Тобто в наведеному прикладі при кожному виконанні ітерації, лічильник "<code>і</code>" буде збільшуватися на одиницю поки не стане рівним десяти.
Найчастіше даний цикл використовується для перебору елементів масиву. Масив – це впорядкований набір даних одного типу. Найпростіший масив можна оголосити та ініціалізувати таким чином: <code>int a[]={1, 5, 6, 1, 3};</code>. Для того, щоб звернутися до певного елементу масиву використовуються квадратні дужки з відповідним індексом елементу. Наприклад а[3] – звернення до четвертого елементу масиву (номери елементів відраховуються з нуля). В наступному прикладі створюється масив і послідовно виводяться його елементи:
<syntaxhighlight lang=java>
public class MyArray {
public static void main(String[] args) {
int a[] = {1, 5, 6, 1, 3}; // створюємо масив і заповнюємо його числами
int size = a.length;
System.out.println("Елементи масиву:");
for (int j = 0; j < size; j++) {
System.out.println("а[" + j + "]=" + a[j]);
}
}
}
</syntaxhighlight>
Результат виконання:
<pre>
Елементи масиву:
а[0]=1
а[1]=5
а[2]=6
а[3]=1
а[4]=3
</pre>
В дужках циклу for, при потребі, одночасно можна проходити по кількох змінних:
<syntaxhighlight lang=java>
for (int i=0,j=20; i<=j+2;i++,j--) {
//code
}
</syntaxhighlight>
===Цикл «for each»===
Починаючи з java SE 5.0 в мові з’явився новий цикл, призначення якого є перебір елементів масиву або подібних до масиву типів даних (колекції).
Загальний вигляд циклу наступний:
<pre>
for (type var : arr) {
//тіло циклу
}
</pre>
Наприклад, вивести елементи масиву ''a'', можна таким чином:
<syntaxhighlight lang="java">
for (int element : a)
System.out.println(element);
</syntaxhighlight>
Використання даного циклу, дозволяє уникнути проблем пов’язаних з помилками при заданні умови в класичному циклі for.
В інших мовах програмування цикл такого виду так і називається foreach, проте, щоб уникнути необхідності значних змін в пакетах, в java пішли простішим шляхом і перевантажили цикл for.
==Інструкції, що порушують порядок виконання==
В java відсутня інструкція <code>goto</code>, яка дозволяла переходити в будь-яке місце в програмі. Її використання давно вважається поганим стилем програмування, оскільки робить текст програми заплутаним. Про це, зокрема, писав ще [[w:Дональд Кнут|Дональд Кнут]] і він же зазначав, що інколи все таки корисно її застосовувати, щоб припинити виконання певного методу, циклу чи блоку і вийти за їхні межі. Для цієї мети в java існують спеціальні інструкції. Зокрема, інструкцію <code>'''break'''</code> можна використати для передчасного виходу з циклу.
<syntaxhighlight lang=java>
while (years <= 100)
{
balance += payment;
double interest = balance * interestRate / 100;
balance += interest;
if (balance >= goal) break;
years++;
}
</syntaxhighlight>
Таким чином додано дві умови для виходу з циклу. Хоча даний фрагмент можна також переписати наступним чином:
<syntaxhighlight lang=java>
while (years <= 100 && balance < goal)
{
balance += payment;
double interest = balance * interestRate / 100;
balance += interest;
if (balance < goal)
years++;
}
</syntaxhighlight>
Якщо ми використовуємо вкладені цикли (один цикл в іншому), то інструкція <code>break</code> припинить цикл, в якому вона знаходиться. Якщо вона знаходиться у внутрішньому циклі, то він припинить своє виконання, а зовнішній же цикл буде виконуватись і далі. Якщо потрібно повністю припинити виконання і внутрішнього і зовнішнього, то використовується інструкція <code>break</code> з міткою.
<syntaxhighlight lang=java>
Scanner in = new Scanner(System.in);
int n;
read_data:
while (. . .) // this loop statement is tagged with the label
{
. . .
for (. . .) // this inner loop is not labeled
{
System.out.print("Enter a number >= 0: ");
n = in.nextInt();
if (n < 0) // should never happen—can't go on
break read_data;
// break out of read_data loop
. . .
}
}
// наступна інструкція буде виконана зразу ж після інструкції break з міткою
if (n < 0) // check for bad situation
{
// deal with bad situation
}
else
{
// carry out normal processing
}
</syntaxhighlight>
Після використання <code>break</code> з міткою, часто виникає необхідність перевірити чому саме цикл припинив виконання, що і робиться в кінці наведеного вище фрагменті коду програми.
Якщо ж нам потрібно виходити з циклу, а лише припинити певну його ітерацію, то для цієї використовується інструкція <code>'''continue'''</code>, яка переносить порядок виконання до заголовку інструкції.
<syntaxhighlight lang=java>
Scanner in = new Scanner(System.in);
while (sum < goal)
{
System.out.print("Enter a number: ");
n = in.nextInt();
if (n < 0) continue;
sum += n; // not executed if n < 0
}
</syntaxhighlight>
Щоправда завжди можна обійтися без даних інструкцій змінивши логіку програми. Деякі з програмістів уникають використовувати інструкції <code>break</code> та <code>continue</code>.
==Множинний вибір (switch)==
Інструкція if/else може бути доволі громіздкою, якщо необхідно здійснити множинний вибір з багатьох альтернатив. Тож як і в С/C++ в java існує інструкція <code>switch</code>, яка здійснити вибір з багатьох варіантів. Щоправда вона дещо незграбна і деякі програмісти вважають за краще уникати її використання.
Наприклад, якщо Ви організовуєте певне меню і пропонуєте користувачу вибрати, номер конкретного пункту, то можна використати наступний код:
<syntaxhighlight lang=java>
Scanner in = new Scanner(System.in);
System.out.print("Select an option (1, 2, 3, 4) ");
int choice = in.nextInt();
switch (choice) {
case 1:
. . .
break;
case 2:
. . .
break;
case 3:
. . .
break;
case 4:
. . .
break;
default:
// bad input
. . .
break;
</syntaxhighlight>
Якщо пропустити інструкцію break, то всі інші інструкції будуть також виконані. Тобто якщо справдиться умова першого варіанту, то будуть здійснені ще й дії вказані для виконання у всіх інших варіантах до наступної інструкції break.
<syntaxhighlight lang=java>
int k=1;
switch (k) {
case 1:
System.out.print(1);
case 2:
System.out.print(2);
case 3:
System.out.print(3);
break;
case 4:
System.out.print(4);
break;
default:
// викинути виняток (виведе помилку при виконанні програми)
throw new IllegalStateException("Unexpected value: " + k);
}
</syntaxhighlight>
Як результат буде виведено: '''123'''
До версії '''Java 7''', яка вийшла у 2011 році, case мітка мала бути лише цілим числом або нумерованою константою. Починаючи із Java 7 можна перевіряти таким чином на рівність також рядки:
<syntaxhighlight lang=java>
String input = . . .;
switch (input)
{
case "A":
. . .
break;
. . .
}
</syntaxhighlight>
В '''Java 12''' з'явилася можливість повертати значення з інструкції switch за допомогою ключового слова break, проте в '''Java 13''' для цього ввели додаткове слово <code>yield</code>, а використовувати для цього break заборонили.
<syntaxhighlight lang=java>
int result = switch (mode) {
case "A":
yield 1;
case "B":
yield 2;
. . .
</syntaxhighlight>
В '''Java 12''' також для switch з'явився синтаксис подібний до лямбда виразів з підтримкою повернення значення із switch:
<syntaxhighlight lang=java>
String str="A";
var result = switch (str) {
case "A" -> 1;
case "B" -> 2;
case "C" -> 3;
case "D" -> 4;
default -> throw new IllegalStateException("Unexpected value: " + str);
};
System.out.println(result); //result=1
</syntaxhighlight>
Аналогічний результат можна отримати так:
<syntaxhighlight lang=java>
String str="A";
int result;
switch (str) {
case "A" -> result=1;
case "B" -> result=2;
case "C" -> result=3;
default -> throw new IllegalStateException("Unexpected value: " + str);
};
System.out.println("result="+result);
</syntaxhighlight>
Запримітьте, що інструкція <code>break</code> вже не потрібна. Якщо потрібно, щоб виконалось декілька випадків, то використовуємо кому між значеннями case (раніше для цього спеціально пропускалась інструкція break):
<syntaxhighlight lang=java>
String str="A";
var result = switch (str) {
case "A","B","C" -> 1;
case "D" -> 4;
default -> throw new IllegalStateException("Unexpected value: " + str);
};
System.out.println(result); //result=1
</syntaxhighlight>
Якщо потрібно виконати певні інструкції в блоці, то для повернення результату використовується інструкція yield (починаючи з '''Java 13'''):
<syntaxhighlight lang=java>
String str="C";
var result = switch (str) {
case "A" -> 1;
case "B" -> 2;
case "C" -> {
System.out.println("3!");
yield 3; // return 3
}
default -> throw new IllegalStateException("Unexpected value: " + str);
};
System.out.println("result="+result); //result=3
</syntaxhighlight>
Замість цифри, при поверненні, може використовуватися змінна або вираз.
<syntaxhighlight lang=java>
int x=2;
int y=3;
String str="C";
var result = switch (str) {
case "A" -> x+y;
. . .
</syntaxhighlight>
==Додатковий матеріал==
* [http://ukr-technologies.blogspot.com/2014/10/java-for.html Цикл for (відеоурок)]
* [http://ukr-technologies.blogspot.com/2014/11/while-dowhile.html Цикли while та do-while (відеоурок)]
{{Гортання сторінок|Вступ в класи та методи|Масиви}}
[[Категорія:Освоюємо Java]]
opvv4xuisp3rsurvn3gfjxkdep81wor
Освоюємо Java/Винятки
0
4311
36898
30932
2022-08-06T18:30:10Z
Володимир Груша
985
/* Throws */
wikitext
text/x-wiki
'''Виняткова ситуація''' або просто '''виняток''' (англ. exception) – це аварійний стан, який відбувається саме під час виконання програми. Прикладом є — ділення на нуль, помилки читання з файлу та мережі тощо. Іншими словами – це помилки які можуть виникнути при виконанні програми. В ряді мов програмування необхідно заздалегідь передбачити можливість тієї чи іншої помилки і передбачити шлях її обробки. В java для цього передбачений спеціальний механізм винятків.
==Винятки в java==
Виняток в java – це об'єкт, який описує виняткову (тобто, помилкову) ситуацію, що відбулась в певному місці коду. Коли така ситуація виникає створюється об'єкт, який передається («вкидається») в метод, в якому виникла помилка. Далі в методі даний виняток може оброблятися, або бути переданий ще кудись для обробки.
Розглянемо для прикладу наступну програму '''DivZero.java'''
<syntaxhighlight lang="java">
public class DivZero {
public static void main(String[] args) {
int my = 0;
int medium = 44 / my;
System.out.println("medium=" + medium);
}
}
</syntaxhighlight>
Як бачимо в програмі присутнє ділення на нуль. При компіляції ми не отримаємо помилок. Проте, після запуску програми, отримаємо наступне:
<pre>
Exception in thread "main" java.lang.ArithmeticException: / by zero
at DivZero.main(DivZero.java:4)
</pre>
Це так звана ''траса стеку викликів''. Перший рядок означає тип-винятку. Як бачимо тут маємо ArithmeticException з діленням на нуль. java.lang – це пакет класів, який завжди доступний в програмі і який містить найбільш використовувані класи. Тобто його не потрібно імпортувати. Другий рядок вказує де саме відбулась виняткова ситуація: 4-й рядок у файлі DivZero.java в методі main() класу DivZero. При цьому як бачимо програма завершила своє виконання аварійно. Для уникнення цього існує відповідний механізм обробки винятків, який дозволяє перехопити виняток, одержати інформацію про нього, обробити його здійснивши певні дії для нормального закінчення або продовження виконання програми.
==Типи винятків==
Усі типи винятків є підкласами класу '''Throwable''', який входить в базовий пакет класів Java - java.lang. Тобто він є вершиною ієрархії класів винятків. Його два підкласи '''Error''' та '''Exception''' утворюють дві основні гілки винятків.
Клас Error з його підкласами - це помилки виконавчого середовища java. І які зазвичай не виникають при нормальній роботі середовища java. Такі винятки зазвичай не можуть бути оброблені в програмі.
Гілка класу Exception - це винятки, які програма повинна вловлювати(catch). Від даного класу та його підкласів можна утворювати власні підкласи. Важливим його підкласом є клас '''RuntimeException'''. Винятки даного типу включають такі винятки як ділення на нуль та помилкова індексація масивів.
Актуальну ієрархію класів винятків можна подивитися і уточнити в офіційній документації до JDK<ref>[http://docs.oracle.com/javase/7/docs/api/index.html Java™ Platform, Standard Edition 7 API Specification (Натисніть TREE для перегляду ієрархії класів)]</ref>.
==Конструкція try==
Для обробки виняткових ситуацій використовується п’ять ключових слів: try, catch, throw, throws та finally.
Інструкції програми, в яких може виникнути помилка, контролюються за допомогою конструкції try.
Загальна форма наступна:
<pre>
try{
//блок коду для контролю над помилками
} catch (тип-винятку1 об’єкт-винятку) {
//дії при виникненні типу винятку1 (обробник винятку)
} catch (тип-винятку2 об’єкт-винятку) {
//дії при виникненні типу винятку2 (обробник винятку)
}
//….
[finally{
//дії при виході з конструкції try.
}]
</pre>
Після інструкції try ми розміщуємо «небезпечний» код, у блоці catch відбувається обробка винятку, причому може бути кілька інструкцій catch. Завершувати конструкцію може інструкція finally, в ній розміщується код, який буде виконаний після обробки винятку в інструкції catch.
Таким чином можемо переписати програму з діленням на нуль:
<syntaxhighlight lang=java>
public class DivZero {
public static void main(String args[]){
int my=0;
try{
int medium=44/my;
System.out.println("medium="+medium);
}catch(ArithmeticException e){
System.out.println("Ділення на нуль!");
}
System.out.println("Продовження виконання...");
}
}
</syntaxhighlight>
Результат виконання:
<pre>Ділення на нуль!
Продовження виконання...</pre>
Як бачимо, для перехоплення винятку, код, через який виникала помилка, знаходиться у середині конструкції try. Також, зверніть увагу, що після виникнення виняткової ситуації наступний рядок ''System.out.println("medium="+medium);'' не було виведено, оскільки виняток був переданий для обробки в catch. Після інструкції програми в якій відбулась виняткова ситуація, всі наступні рядки до інструкції catch пропускаються і не будуть виконуватись. І, як бачимо з результату виконання, наша програма продовжила виконання по закінченню блоку try, а не завершила своє виконання аварійно.
===try з ресурсами===
При використанні всередині try певних ресурсів, наприклад, файлів, при виникненні винятку необхідно було передбачити закриття відкритих ресурсів. Для цієї мети раніше приходилося використовувати блок finally. У Java 7 з'явилася конструкція try з ресурсами (англ. try-with-resources)<ref>[https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html The try-with-resources Statement]</ref>. Тепер просто можна створити ресурс у дужках зразу ж після ключового слова try і java сама потурбується про закриття ресурсу. Приклад:
<syntaxhighlight lang="java">
static String readFirstLineFromFile(String path) throws IOException {
try (BufferedReader br =
new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}</syntaxhighlight>
==Throw==
В наведених вище прикладах ми здійснювали лише обробку винятків викинутих виконавчим середовищем java. Проте існує можливість викидання власних винятків. Для цього існує інструкція Throw. Загальна форма її наступна:
<pre>
throw ThrowableInstance;
</pre>
Тут ThrowableInstance – це тип винятку, який повинен бути або типом Throwable, або мати тип його підкласів. Щоб програма викинула ваш виняток необхідно скористатися оператором new. Для того, щоб одержати(перехопити) тип винятку можна скористатися інструкцією catch, як це ми робили вище.
Після інструкції throw відбувається аналогічне породження винятку як у вище наведених прикладах. Тобто усі інструкції пропускаються до найближчого блоку інструкції catch, де необхідно здійснити обробку винятку. Якщо catch не буде знайдено, то обробник винятків, що використовується по замовчуванню, призупиняє виконання програми і друкує відбиток стеку (stack trace).
Приклад:
<syntaxhighlight lang="java">
public class ThrowNullException {
public static void main(String args[]){
try{
throw new NullPointerException("Пробний виняток");
}catch(Exception e){
System.out.println("Наш витяток: "+e);
}
}
}
</syntaxhighlight>
Результат:
<pre>
Наш витяток: java.lang.NullPointerException: Пробний виняток
</pre>
Програма демонструє як створювати один із стандартних винятків. Більшість вбудованих run-time винятків Java мають щонайменше два конструктори. Один за замовчуванням без параметрів і один із параметром String, який дозволяє задати додатковий опис. Опис можна вивести на консоль за допомогою методів '''print(), println()'''. Також його можна отримати використавши метод '''getMessage()''' класу Throwable.
Можна створити власний тип винятку як підклас уже існуючого типу.
==Throws==
Якщо метод породжує виняток і не обробляє його, то він повинен вказати про це, щоб обробка винятку була здійснена у місці виклику даного методу. Це здійснюється за допомогою застереження throws в оголошенні методу. Після нього вказується підряд через кому усі винятки, які можуть бути викинуті методом, окрім винятків класів Error та RuntimeException і їхніх підкласів. Нагадаємо, що клас Error – це необроблювані винятки, RuntimeException – винятки, які виникають в результаті помилки програміста (вихід за межі масиву, нульове посилання, невірне перетворення типів). Інші винятки – це помилки доступу, які доволі часто вимагають відповідної обробки.
Загальна форма оголошення методу наступна:
<pre>
тип ім’я_методу(список_параметрів) throws список_винятків
{
// тіло методу
}
</pre>
Наступна програма демонструє використання throws у методі де виникає виняток IllegalAccessException.
<syntaxhighlight lang="java">
public class ThrowsException {
public static void exceptionMethod () throws IllegalAccessException{
System.out.println("Всередині exceptionMethod().");
throw new IllegalAccessException("Помилка доступу");
}
public static void main(String args[]){
try{
exceptionMethod();
System.out.println("Кінець програми"); //даний рядок не буде виведений
}catch(IllegalAccessException e){
System.out.println("Наш витяток: "+e);
}
}
}
</syntaxhighlight>
Результат:
<pre>
Всередині ExceptionMethod().
Наш витяток: java.lang.IllegalAccessException: Помилка доступу
</pre>
Як бачимо тепер обробка винятку відбувається у методі main(). Без інструкції try-catch програма призупинятиметься з друком відбитку стеку. Слід зауважити, що у методах інструкція throw поводить себе подібно до інструкції return. Тобто виконання методу припиняється і відбувається повернення в місце виклику методу.
==Створення власних винятків==
Якщо вам не підходить жоден з існуючих класів винятків, то можна створити власний. Він повинен розширювати клас Exception, або будь-який із похідних класів.
<syntaxhighlight lang="java">
class FileFormatException extends IOException
(
public FileFormatException () {} // конструктор по замовчуванню
public FileFormatException(String gripe) // конструктор, що забезпечує повернення зазначеного повідомлення
{
super(gripe);
}
}
</syntaxhighlight>
Тепер в коді, що повинен породжувати виняток можна вставити викидання даного винятку:<code>throw new FileFormatException(); </code>.
==Додаткові джерела==
* [http://docs.oracle.com/javase/tutorial/essential/exceptions/index.html Урок: Винятки // Java посібники на сайті Oracle (англ)]
==Примітки==
<references/>
(даний розділ незавершений, потребує доповнення. Необхідно дописати: отримання інформації про винятки, зчеплення винятків, створення власних)
[[Категорія:Освоюємо Java]]
{{Гортання сторінок|Об'єкти і класи|Графічний інтерфейс користувача}}
mlvnwo5ztvm7owfspsz6g3mw8iiedbq
36899
36898
2022-08-06T18:40:29Z
Володимир Груша
985
/* Створення власних винятків */
wikitext
text/x-wiki
'''Виняткова ситуація''' або просто '''виняток''' (англ. exception) – це аварійний стан, який відбувається саме під час виконання програми. Прикладом є — ділення на нуль, помилки читання з файлу та мережі тощо. Іншими словами – це помилки які можуть виникнути при виконанні програми. В ряді мов програмування необхідно заздалегідь передбачити можливість тієї чи іншої помилки і передбачити шлях її обробки. В java для цього передбачений спеціальний механізм винятків.
==Винятки в java==
Виняток в java – це об'єкт, який описує виняткову (тобто, помилкову) ситуацію, що відбулась в певному місці коду. Коли така ситуація виникає створюється об'єкт, який передається («вкидається») в метод, в якому виникла помилка. Далі в методі даний виняток може оброблятися, або бути переданий ще кудись для обробки.
Розглянемо для прикладу наступну програму '''DivZero.java'''
<syntaxhighlight lang="java">
public class DivZero {
public static void main(String[] args) {
int my = 0;
int medium = 44 / my;
System.out.println("medium=" + medium);
}
}
</syntaxhighlight>
Як бачимо в програмі присутнє ділення на нуль. При компіляції ми не отримаємо помилок. Проте, після запуску програми, отримаємо наступне:
<pre>
Exception in thread "main" java.lang.ArithmeticException: / by zero
at DivZero.main(DivZero.java:4)
</pre>
Це так звана ''траса стеку викликів''. Перший рядок означає тип-винятку. Як бачимо тут маємо ArithmeticException з діленням на нуль. java.lang – це пакет класів, який завжди доступний в програмі і який містить найбільш використовувані класи. Тобто його не потрібно імпортувати. Другий рядок вказує де саме відбулась виняткова ситуація: 4-й рядок у файлі DivZero.java в методі main() класу DivZero. При цьому як бачимо програма завершила своє виконання аварійно. Для уникнення цього існує відповідний механізм обробки винятків, який дозволяє перехопити виняток, одержати інформацію про нього, обробити його здійснивши певні дії для нормального закінчення або продовження виконання програми.
==Типи винятків==
Усі типи винятків є підкласами класу '''Throwable''', який входить в базовий пакет класів Java - java.lang. Тобто він є вершиною ієрархії класів винятків. Його два підкласи '''Error''' та '''Exception''' утворюють дві основні гілки винятків.
Клас Error з його підкласами - це помилки виконавчого середовища java. І які зазвичай не виникають при нормальній роботі середовища java. Такі винятки зазвичай не можуть бути оброблені в програмі.
Гілка класу Exception - це винятки, які програма повинна вловлювати(catch). Від даного класу та його підкласів можна утворювати власні підкласи. Важливим його підкласом є клас '''RuntimeException'''. Винятки даного типу включають такі винятки як ділення на нуль та помилкова індексація масивів.
Актуальну ієрархію класів винятків можна подивитися і уточнити в офіційній документації до JDK<ref>[http://docs.oracle.com/javase/7/docs/api/index.html Java™ Platform, Standard Edition 7 API Specification (Натисніть TREE для перегляду ієрархії класів)]</ref>.
==Конструкція try==
Для обробки виняткових ситуацій використовується п’ять ключових слів: try, catch, throw, throws та finally.
Інструкції програми, в яких може виникнути помилка, контролюються за допомогою конструкції try.
Загальна форма наступна:
<pre>
try{
//блок коду для контролю над помилками
} catch (тип-винятку1 об’єкт-винятку) {
//дії при виникненні типу винятку1 (обробник винятку)
} catch (тип-винятку2 об’єкт-винятку) {
//дії при виникненні типу винятку2 (обробник винятку)
}
//….
[finally{
//дії при виході з конструкції try.
}]
</pre>
Після інструкції try ми розміщуємо «небезпечний» код, у блоці catch відбувається обробка винятку, причому може бути кілька інструкцій catch. Завершувати конструкцію може інструкція finally, в ній розміщується код, який буде виконаний після обробки винятку в інструкції catch.
Таким чином можемо переписати програму з діленням на нуль:
<syntaxhighlight lang=java>
public class DivZero {
public static void main(String args[]){
int my=0;
try{
int medium=44/my;
System.out.println("medium="+medium);
}catch(ArithmeticException e){
System.out.println("Ділення на нуль!");
}
System.out.println("Продовження виконання...");
}
}
</syntaxhighlight>
Результат виконання:
<pre>Ділення на нуль!
Продовження виконання...</pre>
Як бачимо, для перехоплення винятку, код, через який виникала помилка, знаходиться у середині конструкції try. Також, зверніть увагу, що після виникнення виняткової ситуації наступний рядок ''System.out.println("medium="+medium);'' не було виведено, оскільки виняток був переданий для обробки в catch. Після інструкції програми в якій відбулась виняткова ситуація, всі наступні рядки до інструкції catch пропускаються і не будуть виконуватись. І, як бачимо з результату виконання, наша програма продовжила виконання по закінченню блоку try, а не завершила своє виконання аварійно.
===try з ресурсами===
При використанні всередині try певних ресурсів, наприклад, файлів, при виникненні винятку необхідно було передбачити закриття відкритих ресурсів. Для цієї мети раніше приходилося використовувати блок finally. У Java 7 з'явилася конструкція try з ресурсами (англ. try-with-resources)<ref>[https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html The try-with-resources Statement]</ref>. Тепер просто можна створити ресурс у дужках зразу ж після ключового слова try і java сама потурбується про закриття ресурсу. Приклад:
<syntaxhighlight lang="java">
static String readFirstLineFromFile(String path) throws IOException {
try (BufferedReader br =
new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}</syntaxhighlight>
==Throw==
В наведених вище прикладах ми здійснювали лише обробку винятків викинутих виконавчим середовищем java. Проте існує можливість викидання власних винятків. Для цього існує інструкція Throw. Загальна форма її наступна:
<pre>
throw ThrowableInstance;
</pre>
Тут ThrowableInstance – це тип винятку, який повинен бути або типом Throwable, або мати тип його підкласів. Щоб програма викинула ваш виняток необхідно скористатися оператором new. Для того, щоб одержати(перехопити) тип винятку можна скористатися інструкцією catch, як це ми робили вище.
Після інструкції throw відбувається аналогічне породження винятку як у вище наведених прикладах. Тобто усі інструкції пропускаються до найближчого блоку інструкції catch, де необхідно здійснити обробку винятку. Якщо catch не буде знайдено, то обробник винятків, що використовується по замовчуванню, призупиняє виконання програми і друкує відбиток стеку (stack trace).
Приклад:
<syntaxhighlight lang="java">
public class ThrowNullException {
public static void main(String args[]){
try{
throw new NullPointerException("Пробний виняток");
}catch(Exception e){
System.out.println("Наш витяток: "+e);
}
}
}
</syntaxhighlight>
Результат:
<pre>
Наш витяток: java.lang.NullPointerException: Пробний виняток
</pre>
Програма демонструє як створювати один із стандартних винятків. Більшість вбудованих run-time винятків Java мають щонайменше два конструктори. Один за замовчуванням без параметрів і один із параметром String, який дозволяє задати додатковий опис. Опис можна вивести на консоль за допомогою методів '''print(), println()'''. Також його можна отримати використавши метод '''getMessage()''' класу Throwable.
Можна створити власний тип винятку як підклас уже існуючого типу.
==Throws==
Якщо метод породжує виняток і не обробляє його, то він повинен вказати про це, щоб обробка винятку була здійснена у місці виклику даного методу. Це здійснюється за допомогою застереження throws в оголошенні методу. Після нього вказується підряд через кому усі винятки, які можуть бути викинуті методом, окрім винятків класів Error та RuntimeException і їхніх підкласів. Нагадаємо, що клас Error – це необроблювані винятки, RuntimeException – винятки, які виникають в результаті помилки програміста (вихід за межі масиву, нульове посилання, невірне перетворення типів). Інші винятки – це помилки доступу, які доволі часто вимагають відповідної обробки.
Загальна форма оголошення методу наступна:
<pre>
тип ім’я_методу(список_параметрів) throws список_винятків
{
// тіло методу
}
</pre>
Наступна програма демонструє використання throws у методі де виникає виняток IllegalAccessException.
<syntaxhighlight lang="java">
public class ThrowsException {
public static void exceptionMethod () throws IllegalAccessException{
System.out.println("Всередині exceptionMethod().");
throw new IllegalAccessException("Помилка доступу");
}
public static void main(String args[]){
try{
exceptionMethod();
System.out.println("Кінець програми"); //даний рядок не буде виведений
}catch(IllegalAccessException e){
System.out.println("Наш витяток: "+e);
}
}
}
</syntaxhighlight>
Результат:
<pre>
Всередині ExceptionMethod().
Наш витяток: java.lang.IllegalAccessException: Помилка доступу
</pre>
Як бачимо тепер обробка винятку відбувається у методі main(). Без інструкції try-catch програма призупинятиметься з друком відбитку стеку. Слід зауважити, що у методах інструкція throw поводить себе подібно до інструкції return. Тобто виконання методу припиняється і відбувається повернення в місце виклику методу.
==Створення власних винятків==
Якщо вам не підходить жоден з існуючих класів винятків, то можна створити власний. Він повинен розширювати клас Exception, або будь-який із похідних класів.
<syntaxhighlight lang="java">
package exceptions;
import java.io.IOException;
class FileFormatException extends IOException
{
public FileFormatException () {} // конструктор по замовчуванню
public FileFormatException(String gripe) // конструктор, що забезпечує повернення зазначеного повідомлення
{
super(gripe);
}
}
</syntaxhighlight>
Тепер в коді, що повинен породжувати виняток можна вставити викидання даного винятку:<code>throw new FileFormatException(); </code>.
<syntaxhighlight lang="java">
package exceptions;
public class TestNewException {
public static void main(String[] args) {
try {
throw new FileFormatException("Не той формат файлу");
} catch (Exception e) {
System.out.println("Повідомлення винятку: "+e.getMessage());
}
}
}
</syntaxhighlight>
==Додаткові джерела==
* [http://docs.oracle.com/javase/tutorial/essential/exceptions/index.html Урок: Винятки // Java посібники на сайті Oracle (англ)]
==Примітки==
<references/>
(даний розділ незавершений, потребує доповнення. Необхідно дописати: отримання інформації про винятки, зчеплення винятків, створення власних)
[[Категорія:Освоюємо Java]]
{{Гортання сторінок|Об'єкти і класи|Графічний інтерфейс користувача}}
5hepz7mmu9m16al2hyvjkkddjm03gq3
36900
36899
2022-08-06T18:41:28Z
Володимир Груша
985
/* Створення власних винятків */
wikitext
text/x-wiki
'''Виняткова ситуація''' або просто '''виняток''' (англ. exception) – це аварійний стан, який відбувається саме під час виконання програми. Прикладом є — ділення на нуль, помилки читання з файлу та мережі тощо. Іншими словами – це помилки які можуть виникнути при виконанні програми. В ряді мов програмування необхідно заздалегідь передбачити можливість тієї чи іншої помилки і передбачити шлях її обробки. В java для цього передбачений спеціальний механізм винятків.
==Винятки в java==
Виняток в java – це об'єкт, який описує виняткову (тобто, помилкову) ситуацію, що відбулась в певному місці коду. Коли така ситуація виникає створюється об'єкт, який передається («вкидається») в метод, в якому виникла помилка. Далі в методі даний виняток може оброблятися, або бути переданий ще кудись для обробки.
Розглянемо для прикладу наступну програму '''DivZero.java'''
<syntaxhighlight lang="java">
public class DivZero {
public static void main(String[] args) {
int my = 0;
int medium = 44 / my;
System.out.println("medium=" + medium);
}
}
</syntaxhighlight>
Як бачимо в програмі присутнє ділення на нуль. При компіляції ми не отримаємо помилок. Проте, після запуску програми, отримаємо наступне:
<pre>
Exception in thread "main" java.lang.ArithmeticException: / by zero
at DivZero.main(DivZero.java:4)
</pre>
Це так звана ''траса стеку викликів''. Перший рядок означає тип-винятку. Як бачимо тут маємо ArithmeticException з діленням на нуль. java.lang – це пакет класів, який завжди доступний в програмі і який містить найбільш використовувані класи. Тобто його не потрібно імпортувати. Другий рядок вказує де саме відбулась виняткова ситуація: 4-й рядок у файлі DivZero.java в методі main() класу DivZero. При цьому як бачимо програма завершила своє виконання аварійно. Для уникнення цього існує відповідний механізм обробки винятків, який дозволяє перехопити виняток, одержати інформацію про нього, обробити його здійснивши певні дії для нормального закінчення або продовження виконання програми.
==Типи винятків==
Усі типи винятків є підкласами класу '''Throwable''', який входить в базовий пакет класів Java - java.lang. Тобто він є вершиною ієрархії класів винятків. Його два підкласи '''Error''' та '''Exception''' утворюють дві основні гілки винятків.
Клас Error з його підкласами - це помилки виконавчого середовища java. І які зазвичай не виникають при нормальній роботі середовища java. Такі винятки зазвичай не можуть бути оброблені в програмі.
Гілка класу Exception - це винятки, які програма повинна вловлювати(catch). Від даного класу та його підкласів можна утворювати власні підкласи. Важливим його підкласом є клас '''RuntimeException'''. Винятки даного типу включають такі винятки як ділення на нуль та помилкова індексація масивів.
Актуальну ієрархію класів винятків можна подивитися і уточнити в офіційній документації до JDK<ref>[http://docs.oracle.com/javase/7/docs/api/index.html Java™ Platform, Standard Edition 7 API Specification (Натисніть TREE для перегляду ієрархії класів)]</ref>.
==Конструкція try==
Для обробки виняткових ситуацій використовується п’ять ключових слів: try, catch, throw, throws та finally.
Інструкції програми, в яких може виникнути помилка, контролюються за допомогою конструкції try.
Загальна форма наступна:
<pre>
try{
//блок коду для контролю над помилками
} catch (тип-винятку1 об’єкт-винятку) {
//дії при виникненні типу винятку1 (обробник винятку)
} catch (тип-винятку2 об’єкт-винятку) {
//дії при виникненні типу винятку2 (обробник винятку)
}
//….
[finally{
//дії при виході з конструкції try.
}]
</pre>
Після інструкції try ми розміщуємо «небезпечний» код, у блоці catch відбувається обробка винятку, причому може бути кілька інструкцій catch. Завершувати конструкцію може інструкція finally, в ній розміщується код, який буде виконаний після обробки винятку в інструкції catch.
Таким чином можемо переписати програму з діленням на нуль:
<syntaxhighlight lang=java>
public class DivZero {
public static void main(String args[]){
int my=0;
try{
int medium=44/my;
System.out.println("medium="+medium);
}catch(ArithmeticException e){
System.out.println("Ділення на нуль!");
}
System.out.println("Продовження виконання...");
}
}
</syntaxhighlight>
Результат виконання:
<pre>Ділення на нуль!
Продовження виконання...</pre>
Як бачимо, для перехоплення винятку, код, через який виникала помилка, знаходиться у середині конструкції try. Також, зверніть увагу, що після виникнення виняткової ситуації наступний рядок ''System.out.println("medium="+medium);'' не було виведено, оскільки виняток був переданий для обробки в catch. Після інструкції програми в якій відбулась виняткова ситуація, всі наступні рядки до інструкції catch пропускаються і не будуть виконуватись. І, як бачимо з результату виконання, наша програма продовжила виконання по закінченню блоку try, а не завершила своє виконання аварійно.
===try з ресурсами===
При використанні всередині try певних ресурсів, наприклад, файлів, при виникненні винятку необхідно було передбачити закриття відкритих ресурсів. Для цієї мети раніше приходилося використовувати блок finally. У Java 7 з'явилася конструкція try з ресурсами (англ. try-with-resources)<ref>[https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html The try-with-resources Statement]</ref>. Тепер просто можна створити ресурс у дужках зразу ж після ключового слова try і java сама потурбується про закриття ресурсу. Приклад:
<syntaxhighlight lang="java">
static String readFirstLineFromFile(String path) throws IOException {
try (BufferedReader br =
new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}</syntaxhighlight>
==Throw==
В наведених вище прикладах ми здійснювали лише обробку винятків викинутих виконавчим середовищем java. Проте існує можливість викидання власних винятків. Для цього існує інструкція Throw. Загальна форма її наступна:
<pre>
throw ThrowableInstance;
</pre>
Тут ThrowableInstance – це тип винятку, який повинен бути або типом Throwable, або мати тип його підкласів. Щоб програма викинула ваш виняток необхідно скористатися оператором new. Для того, щоб одержати(перехопити) тип винятку можна скористатися інструкцією catch, як це ми робили вище.
Після інструкції throw відбувається аналогічне породження винятку як у вище наведених прикладах. Тобто усі інструкції пропускаються до найближчого блоку інструкції catch, де необхідно здійснити обробку винятку. Якщо catch не буде знайдено, то обробник винятків, що використовується по замовчуванню, призупиняє виконання програми і друкує відбиток стеку (stack trace).
Приклад:
<syntaxhighlight lang="java">
public class ThrowNullException {
public static void main(String args[]){
try{
throw new NullPointerException("Пробний виняток");
}catch(Exception e){
System.out.println("Наш витяток: "+e);
}
}
}
</syntaxhighlight>
Результат:
<pre>
Наш витяток: java.lang.NullPointerException: Пробний виняток
</pre>
Програма демонструє як створювати один із стандартних винятків. Більшість вбудованих run-time винятків Java мають щонайменше два конструктори. Один за замовчуванням без параметрів і один із параметром String, який дозволяє задати додатковий опис. Опис можна вивести на консоль за допомогою методів '''print(), println()'''. Також його можна отримати використавши метод '''getMessage()''' класу Throwable.
Можна створити власний тип винятку як підклас уже існуючого типу.
==Throws==
Якщо метод породжує виняток і не обробляє його, то він повинен вказати про це, щоб обробка винятку була здійснена у місці виклику даного методу. Це здійснюється за допомогою застереження throws в оголошенні методу. Після нього вказується підряд через кому усі винятки, які можуть бути викинуті методом, окрім винятків класів Error та RuntimeException і їхніх підкласів. Нагадаємо, що клас Error – це необроблювані винятки, RuntimeException – винятки, які виникають в результаті помилки програміста (вихід за межі масиву, нульове посилання, невірне перетворення типів). Інші винятки – це помилки доступу, які доволі часто вимагають відповідної обробки.
Загальна форма оголошення методу наступна:
<pre>
тип ім’я_методу(список_параметрів) throws список_винятків
{
// тіло методу
}
</pre>
Наступна програма демонструє використання throws у методі де виникає виняток IllegalAccessException.
<syntaxhighlight lang="java">
public class ThrowsException {
public static void exceptionMethod () throws IllegalAccessException{
System.out.println("Всередині exceptionMethod().");
throw new IllegalAccessException("Помилка доступу");
}
public static void main(String args[]){
try{
exceptionMethod();
System.out.println("Кінець програми"); //даний рядок не буде виведений
}catch(IllegalAccessException e){
System.out.println("Наш витяток: "+e);
}
}
}
</syntaxhighlight>
Результат:
<pre>
Всередині ExceptionMethod().
Наш витяток: java.lang.IllegalAccessException: Помилка доступу
</pre>
Як бачимо тепер обробка винятку відбувається у методі main(). Без інструкції try-catch програма призупинятиметься з друком відбитку стеку. Слід зауважити, що у методах інструкція throw поводить себе подібно до інструкції return. Тобто виконання методу припиняється і відбувається повернення в місце виклику методу.
==Створення власних винятків==
Якщо вам не підходить жоден з існуючих класів винятків, то можна створити власний. Він повинен розширювати клас Exception, або будь-який із похідних класів.
<syntaxhighlight lang="java">
package exceptions;
import java.io.IOException;
class FileFormatException extends IOException
{
public FileFormatException () {} // конструктор по замовчуванню
public FileFormatException(String gripe) // конструктор, що забезпечує повернення зазначеного повідомлення
{
super(gripe);
}
}
</syntaxhighlight>
Тепер в коді, що повинен породжувати виняток можна вставити викидання даного винятку:<code>throw new FileFormatException(); </code>.
<syntaxhighlight lang="java">
package exceptions;
public class TestNewException {
public static void main(String[] args) {
try {
throw new FileFormatException("Не той формат файлу");
} catch (Exception e) {
System.out.println("Повідомлення винятку: "+e.getMessage());
}
}
}
</syntaxhighlight>
Результат:
<pre>
Повідомлення винятку: Не той формат файлу
</pre>
==Додаткові джерела==
* [http://docs.oracle.com/javase/tutorial/essential/exceptions/index.html Урок: Винятки // Java посібники на сайті Oracle (англ)]
==Примітки==
<references/>
(даний розділ незавершений, потребує доповнення. Необхідно дописати: отримання інформації про винятки, зчеплення винятків, створення власних)
[[Категорія:Освоюємо Java]]
{{Гортання сторінок|Об'єкти і класи|Графічний інтерфейс користувача}}
az8u6xf80we623ii3upa6m57r00nzs2
36903
36900
2022-08-06T19:19:28Z
Володимир Груша
985
/* Throws */
wikitext
text/x-wiki
'''Виняткова ситуація''' або просто '''виняток''' (англ. exception) – це аварійний стан, який відбувається саме під час виконання програми. Прикладом є — ділення на нуль, помилки читання з файлу та мережі тощо. Іншими словами – це помилки які можуть виникнути при виконанні програми. В ряді мов програмування необхідно заздалегідь передбачити можливість тієї чи іншої помилки і передбачити шлях її обробки. В java для цього передбачений спеціальний механізм винятків.
==Винятки в java==
Виняток в java – це об'єкт, який описує виняткову (тобто, помилкову) ситуацію, що відбулась в певному місці коду. Коли така ситуація виникає створюється об'єкт, який передається («вкидається») в метод, в якому виникла помилка. Далі в методі даний виняток може оброблятися, або бути переданий ще кудись для обробки.
Розглянемо для прикладу наступну програму '''DivZero.java'''
<syntaxhighlight lang="java">
public class DivZero {
public static void main(String[] args) {
int my = 0;
int medium = 44 / my;
System.out.println("medium=" + medium);
}
}
</syntaxhighlight>
Як бачимо в програмі присутнє ділення на нуль. При компіляції ми не отримаємо помилок. Проте, після запуску програми, отримаємо наступне:
<pre>
Exception in thread "main" java.lang.ArithmeticException: / by zero
at DivZero.main(DivZero.java:4)
</pre>
Це так звана ''траса стеку викликів''. Перший рядок означає тип-винятку. Як бачимо тут маємо ArithmeticException з діленням на нуль. java.lang – це пакет класів, який завжди доступний в програмі і який містить найбільш використовувані класи. Тобто його не потрібно імпортувати. Другий рядок вказує де саме відбулась виняткова ситуація: 4-й рядок у файлі DivZero.java в методі main() класу DivZero. При цьому як бачимо програма завершила своє виконання аварійно. Для уникнення цього існує відповідний механізм обробки винятків, який дозволяє перехопити виняток, одержати інформацію про нього, обробити його здійснивши певні дії для нормального закінчення або продовження виконання програми.
==Типи винятків==
Усі типи винятків є підкласами класу '''Throwable''', який входить в базовий пакет класів Java - java.lang. Тобто він є вершиною ієрархії класів винятків. Його два підкласи '''Error''' та '''Exception''' утворюють дві основні гілки винятків.
Клас Error з його підкласами - це помилки виконавчого середовища java. І які зазвичай не виникають при нормальній роботі середовища java. Такі винятки зазвичай не можуть бути оброблені в програмі.
Гілка класу Exception - це винятки, які програма повинна вловлювати(catch). Від даного класу та його підкласів можна утворювати власні підкласи. Важливим його підкласом є клас '''RuntimeException'''. Винятки даного типу включають такі винятки як ділення на нуль та помилкова індексація масивів.
Актуальну ієрархію класів винятків можна подивитися і уточнити в офіційній документації до JDK<ref>[http://docs.oracle.com/javase/7/docs/api/index.html Java™ Platform, Standard Edition 7 API Specification (Натисніть TREE для перегляду ієрархії класів)]</ref>.
==Конструкція try==
Для обробки виняткових ситуацій використовується п’ять ключових слів: try, catch, throw, throws та finally.
Інструкції програми, в яких може виникнути помилка, контролюються за допомогою конструкції try.
Загальна форма наступна:
<pre>
try{
//блок коду для контролю над помилками
} catch (тип-винятку1 об’єкт-винятку) {
//дії при виникненні типу винятку1 (обробник винятку)
} catch (тип-винятку2 об’єкт-винятку) {
//дії при виникненні типу винятку2 (обробник винятку)
}
//….
[finally{
//дії при виході з конструкції try.
}]
</pre>
Після інструкції try ми розміщуємо «небезпечний» код, у блоці catch відбувається обробка винятку, причому може бути кілька інструкцій catch. Завершувати конструкцію може інструкція finally, в ній розміщується код, який буде виконаний після обробки винятку в інструкції catch.
Таким чином можемо переписати програму з діленням на нуль:
<syntaxhighlight lang=java>
public class DivZero {
public static void main(String args[]){
int my=0;
try{
int medium=44/my;
System.out.println("medium="+medium);
}catch(ArithmeticException e){
System.out.println("Ділення на нуль!");
}
System.out.println("Продовження виконання...");
}
}
</syntaxhighlight>
Результат виконання:
<pre>Ділення на нуль!
Продовження виконання...</pre>
Як бачимо, для перехоплення винятку, код, через який виникала помилка, знаходиться у середині конструкції try. Також, зверніть увагу, що після виникнення виняткової ситуації наступний рядок ''System.out.println("medium="+medium);'' не було виведено, оскільки виняток був переданий для обробки в catch. Після інструкції програми в якій відбулась виняткова ситуація, всі наступні рядки до інструкції catch пропускаються і не будуть виконуватись. І, як бачимо з результату виконання, наша програма продовжила виконання по закінченню блоку try, а не завершила своє виконання аварійно.
===try з ресурсами===
При використанні всередині try певних ресурсів, наприклад, файлів, при виникненні винятку необхідно було передбачити закриття відкритих ресурсів. Для цієї мети раніше приходилося використовувати блок finally. У Java 7 з'явилася конструкція try з ресурсами (англ. try-with-resources)<ref>[https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html The try-with-resources Statement]</ref>. Тепер просто можна створити ресурс у дужках зразу ж після ключового слова try і java сама потурбується про закриття ресурсу. Приклад:
<syntaxhighlight lang="java">
static String readFirstLineFromFile(String path) throws IOException {
try (BufferedReader br =
new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}</syntaxhighlight>
==Throw==
В наведених вище прикладах ми здійснювали лише обробку винятків викинутих виконавчим середовищем java. Проте існує можливість викидання власних винятків. Для цього існує інструкція Throw. Загальна форма її наступна:
<pre>
throw ThrowableInstance;
</pre>
Тут ThrowableInstance – це тип винятку, який повинен бути або типом Throwable, або мати тип його підкласів. Щоб програма викинула ваш виняток необхідно скористатися оператором new. Для того, щоб одержати(перехопити) тип винятку можна скористатися інструкцією catch, як це ми робили вище.
Після інструкції throw відбувається аналогічне породження винятку як у вище наведених прикладах. Тобто усі інструкції пропускаються до найближчого блоку інструкції catch, де необхідно здійснити обробку винятку. Якщо catch не буде знайдено, то обробник винятків, що використовується по замовчуванню, призупиняє виконання програми і друкує відбиток стеку (stack trace).
Приклад:
<syntaxhighlight lang="java">
public class ThrowNullException {
public static void main(String args[]){
try{
throw new NullPointerException("Пробний виняток");
}catch(Exception e){
System.out.println("Наш витяток: "+e);
}
}
}
</syntaxhighlight>
Результат:
<pre>
Наш витяток: java.lang.NullPointerException: Пробний виняток
</pre>
Програма демонструє як створювати один із стандартних винятків. Більшість вбудованих run-time винятків Java мають щонайменше два конструктори. Один за замовчуванням без параметрів і один із параметром String, який дозволяє задати додатковий опис. Опис можна вивести на консоль за допомогою методів '''print(), println()'''. Також його можна отримати використавши метод '''getMessage()''' класу Throwable.
Можна створити власний тип винятку як підклас уже існуючого типу.
==Throws==
Якщо метод породжує виняток і не обробляє його, то він повинен вказати про це, щоб обробка винятку була здійснена у місці виклику даного методу. Це здійснюється за допомогою застереження throws в оголошенні методу. Після нього вказується підряд через кому усі винятки, які можуть бути викинуті методом, окрім винятків класів Error та RuntimeException і їхніх підкласів. Нагадаємо, що клас Error – це необроблювані винятки, RuntimeException – винятки, які виникають в результаті помилки програміста (вихід за межі масиву, нульове посилання, невірне перетворення типів). Інші винятки – це помилки доступу, які доволі часто вимагають відповідної обробки.
Загальна форма оголошення методу наступна:
<pre>
тип ім’я_методу(список_параметрів) throws список_винятків
{
// тіло методу
}
</pre>
Наступна програма демонструє використання throws у методі де виникає виняток IllegalAccessException.
<syntaxhighlight lang="java">
public class ThrowsException {
public static void exceptionMethod () throws IllegalAccessException{
System.out.println("Всередині exceptionMethod().");
throw new IllegalAccessException("Помилка доступу");
}
public static void main(String args[]){
try{
exceptionMethod();
System.out.println("Кінець програми"); //даний рядок не буде виведений
}catch(IllegalAccessException e){
System.out.println("Наш витяток: "+e);
}
}
}
</syntaxhighlight>
Результат:
<pre>
Всередині ExceptionMethod().
Наш витяток: java.lang.IllegalAccessException: Помилка доступу
</pre>
Як бачимо тепер обробка винятку відбувається у методі main(). Без інструкції try-catch програма призупинятиметься з друком відбитку стеку. Слід зауважити, що у методах інструкція throw поводить себе подібно до інструкції return. Тобто виконання методу припиняється і відбувається повернення в місце виклику методу.
Інструкцію throws не можливо використати при заміщенні методу в класах нащадках. Тобто якщо метод батьківського класу не викидав виняток, то і відповідний метод класу нащадку не викидатиме виняток.
==Створення власних винятків==
Якщо вам не підходить жоден з існуючих класів винятків, то можна створити власний. Він повинен розширювати клас Exception, або будь-який із похідних класів.
<syntaxhighlight lang="java">
package exceptions;
import java.io.IOException;
class FileFormatException extends IOException
{
public FileFormatException () {} // конструктор по замовчуванню
public FileFormatException(String gripe) // конструктор, що забезпечує повернення зазначеного повідомлення
{
super(gripe);
}
}
</syntaxhighlight>
Тепер в коді, що повинен породжувати виняток можна вставити викидання даного винятку:<code>throw new FileFormatException(); </code>.
<syntaxhighlight lang="java">
package exceptions;
public class TestNewException {
public static void main(String[] args) {
try {
throw new FileFormatException("Не той формат файлу");
} catch (Exception e) {
System.out.println("Повідомлення винятку: "+e.getMessage());
}
}
}
</syntaxhighlight>
Результат:
<pre>
Повідомлення винятку: Не той формат файлу
</pre>
==Додаткові джерела==
* [http://docs.oracle.com/javase/tutorial/essential/exceptions/index.html Урок: Винятки // Java посібники на сайті Oracle (англ)]
==Примітки==
<references/>
(даний розділ незавершений, потребує доповнення. Необхідно дописати: отримання інформації про винятки, зчеплення винятків, створення власних)
[[Категорія:Освоюємо Java]]
{{Гортання сторінок|Об'єкти і класи|Графічний інтерфейс користувача}}
p2jbcqha12cqpg9dob534mf051om41c
36904
36903
2022-08-06T19:20:39Z
Володимир Груша
985
/* Throws */
wikitext
text/x-wiki
'''Виняткова ситуація''' або просто '''виняток''' (англ. exception) – це аварійний стан, який відбувається саме під час виконання програми. Прикладом є — ділення на нуль, помилки читання з файлу та мережі тощо. Іншими словами – це помилки які можуть виникнути при виконанні програми. В ряді мов програмування необхідно заздалегідь передбачити можливість тієї чи іншої помилки і передбачити шлях її обробки. В java для цього передбачений спеціальний механізм винятків.
==Винятки в java==
Виняток в java – це об'єкт, який описує виняткову (тобто, помилкову) ситуацію, що відбулась в певному місці коду. Коли така ситуація виникає створюється об'єкт, який передається («вкидається») в метод, в якому виникла помилка. Далі в методі даний виняток може оброблятися, або бути переданий ще кудись для обробки.
Розглянемо для прикладу наступну програму '''DivZero.java'''
<syntaxhighlight lang="java">
public class DivZero {
public static void main(String[] args) {
int my = 0;
int medium = 44 / my;
System.out.println("medium=" + medium);
}
}
</syntaxhighlight>
Як бачимо в програмі присутнє ділення на нуль. При компіляції ми не отримаємо помилок. Проте, після запуску програми, отримаємо наступне:
<pre>
Exception in thread "main" java.lang.ArithmeticException: / by zero
at DivZero.main(DivZero.java:4)
</pre>
Це так звана ''траса стеку викликів''. Перший рядок означає тип-винятку. Як бачимо тут маємо ArithmeticException з діленням на нуль. java.lang – це пакет класів, який завжди доступний в програмі і який містить найбільш використовувані класи. Тобто його не потрібно імпортувати. Другий рядок вказує де саме відбулась виняткова ситуація: 4-й рядок у файлі DivZero.java в методі main() класу DivZero. При цьому як бачимо програма завершила своє виконання аварійно. Для уникнення цього існує відповідний механізм обробки винятків, який дозволяє перехопити виняток, одержати інформацію про нього, обробити його здійснивши певні дії для нормального закінчення або продовження виконання програми.
==Типи винятків==
Усі типи винятків є підкласами класу '''Throwable''', який входить в базовий пакет класів Java - java.lang. Тобто він є вершиною ієрархії класів винятків. Його два підкласи '''Error''' та '''Exception''' утворюють дві основні гілки винятків.
Клас Error з його підкласами - це помилки виконавчого середовища java. І які зазвичай не виникають при нормальній роботі середовища java. Такі винятки зазвичай не можуть бути оброблені в програмі.
Гілка класу Exception - це винятки, які програма повинна вловлювати(catch). Від даного класу та його підкласів можна утворювати власні підкласи. Важливим його підкласом є клас '''RuntimeException'''. Винятки даного типу включають такі винятки як ділення на нуль та помилкова індексація масивів.
Актуальну ієрархію класів винятків можна подивитися і уточнити в офіційній документації до JDK<ref>[http://docs.oracle.com/javase/7/docs/api/index.html Java™ Platform, Standard Edition 7 API Specification (Натисніть TREE для перегляду ієрархії класів)]</ref>.
==Конструкція try==
Для обробки виняткових ситуацій використовується п’ять ключових слів: try, catch, throw, throws та finally.
Інструкції програми, в яких може виникнути помилка, контролюються за допомогою конструкції try.
Загальна форма наступна:
<pre>
try{
//блок коду для контролю над помилками
} catch (тип-винятку1 об’єкт-винятку) {
//дії при виникненні типу винятку1 (обробник винятку)
} catch (тип-винятку2 об’єкт-винятку) {
//дії при виникненні типу винятку2 (обробник винятку)
}
//….
[finally{
//дії при виході з конструкції try.
}]
</pre>
Після інструкції try ми розміщуємо «небезпечний» код, у блоці catch відбувається обробка винятку, причому може бути кілька інструкцій catch. Завершувати конструкцію може інструкція finally, в ній розміщується код, який буде виконаний після обробки винятку в інструкції catch.
Таким чином можемо переписати програму з діленням на нуль:
<syntaxhighlight lang=java>
public class DivZero {
public static void main(String args[]){
int my=0;
try{
int medium=44/my;
System.out.println("medium="+medium);
}catch(ArithmeticException e){
System.out.println("Ділення на нуль!");
}
System.out.println("Продовження виконання...");
}
}
</syntaxhighlight>
Результат виконання:
<pre>Ділення на нуль!
Продовження виконання...</pre>
Як бачимо, для перехоплення винятку, код, через який виникала помилка, знаходиться у середині конструкції try. Також, зверніть увагу, що після виникнення виняткової ситуації наступний рядок ''System.out.println("medium="+medium);'' не було виведено, оскільки виняток був переданий для обробки в catch. Після інструкції програми в якій відбулась виняткова ситуація, всі наступні рядки до інструкції catch пропускаються і не будуть виконуватись. І, як бачимо з результату виконання, наша програма продовжила виконання по закінченню блоку try, а не завершила своє виконання аварійно.
===try з ресурсами===
При використанні всередині try певних ресурсів, наприклад, файлів, при виникненні винятку необхідно було передбачити закриття відкритих ресурсів. Для цієї мети раніше приходилося використовувати блок finally. У Java 7 з'явилася конструкція try з ресурсами (англ. try-with-resources)<ref>[https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html The try-with-resources Statement]</ref>. Тепер просто можна створити ресурс у дужках зразу ж після ключового слова try і java сама потурбується про закриття ресурсу. Приклад:
<syntaxhighlight lang="java">
static String readFirstLineFromFile(String path) throws IOException {
try (BufferedReader br =
new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}</syntaxhighlight>
==Throw==
В наведених вище прикладах ми здійснювали лише обробку винятків викинутих виконавчим середовищем java. Проте існує можливість викидання власних винятків. Для цього існує інструкція Throw. Загальна форма її наступна:
<pre>
throw ThrowableInstance;
</pre>
Тут ThrowableInstance – це тип винятку, який повинен бути або типом Throwable, або мати тип його підкласів. Щоб програма викинула ваш виняток необхідно скористатися оператором new. Для того, щоб одержати(перехопити) тип винятку можна скористатися інструкцією catch, як це ми робили вище.
Після інструкції throw відбувається аналогічне породження винятку як у вище наведених прикладах. Тобто усі інструкції пропускаються до найближчого блоку інструкції catch, де необхідно здійснити обробку винятку. Якщо catch не буде знайдено, то обробник винятків, що використовується по замовчуванню, призупиняє виконання програми і друкує відбиток стеку (stack trace).
Приклад:
<syntaxhighlight lang="java">
public class ThrowNullException {
public static void main(String args[]){
try{
throw new NullPointerException("Пробний виняток");
}catch(Exception e){
System.out.println("Наш витяток: "+e);
}
}
}
</syntaxhighlight>
Результат:
<pre>
Наш витяток: java.lang.NullPointerException: Пробний виняток
</pre>
Програма демонструє як створювати один із стандартних винятків. Більшість вбудованих run-time винятків Java мають щонайменше два конструктори. Один за замовчуванням без параметрів і один із параметром String, який дозволяє задати додатковий опис. Опис можна вивести на консоль за допомогою методів '''print(), println()'''. Також його можна отримати використавши метод '''getMessage()''' класу Throwable.
Можна створити власний тип винятку як підклас уже існуючого типу.
==Throws==
Якщо метод породжує виняток і не обробляє його, то він повинен вказати про це, щоб обробка винятку була здійснена у місці виклику даного методу. Це здійснюється за допомогою застереження throws в оголошенні методу. Після нього вказується підряд через кому усі винятки, які можуть бути викинуті методом, окрім винятків класів Error та RuntimeException і їхніх підкласів. Нагадаємо, що клас Error – це необроблювані винятки, RuntimeException – винятки, які виникають в результаті помилки програміста (вихід за межі масиву, нульове посилання, невірне перетворення типів). Інші винятки – це помилки доступу, які доволі часто вимагають відповідної обробки.
Загальна форма оголошення методу наступна:
<pre>
тип ім’я_методу(список_параметрів) throws список_винятків
{
// тіло методу
}
</pre>
Наступна програма демонструє використання throws у методі де виникає виняток IllegalAccessException.
<syntaxhighlight lang="java">
public class ThrowsException {
public static void exceptionMethod () throws IllegalAccessException{
System.out.println("Всередині exceptionMethod().");
throw new IllegalAccessException("Помилка доступу");
}
public static void main(String args[]){
try{
exceptionMethod();
System.out.println("Кінець програми"); //даний рядок не буде виведений
}catch(IllegalAccessException e){
System.out.println("Наш витяток: "+e);
}
}
}
</syntaxhighlight>
Результат:
<pre>
Всередині ExceptionMethod().
Наш витяток: java.lang.IllegalAccessException: Помилка доступу
</pre>
Як бачимо тепер обробка винятку відбувається у методі main(). Без інструкції try-catch програма призупинятиметься з друком відбитку стеку. Слід зауважити, що у методах інструкція throw поводить себе подібно до інструкції return. Тобто виконання методу припиняється і відбувається повернення в місце виклику методу.
Інструкцію throws не можливо використати при заміщенні методу в класах нащадках, якщо метод батьківського класу не викидав виняток. Тож відповідний метод класу нащадку не викидатиме виняток.
==Створення власних винятків==
Якщо вам не підходить жоден з існуючих класів винятків, то можна створити власний. Він повинен розширювати клас Exception, або будь-який із похідних класів.
<syntaxhighlight lang="java">
package exceptions;
import java.io.IOException;
class FileFormatException extends IOException
{
public FileFormatException () {} // конструктор по замовчуванню
public FileFormatException(String gripe) // конструктор, що забезпечує повернення зазначеного повідомлення
{
super(gripe);
}
}
</syntaxhighlight>
Тепер в коді, що повинен породжувати виняток можна вставити викидання даного винятку:<code>throw new FileFormatException(); </code>.
<syntaxhighlight lang="java">
package exceptions;
public class TestNewException {
public static void main(String[] args) {
try {
throw new FileFormatException("Не той формат файлу");
} catch (Exception e) {
System.out.println("Повідомлення винятку: "+e.getMessage());
}
}
}
</syntaxhighlight>
Результат:
<pre>
Повідомлення винятку: Не той формат файлу
</pre>
==Додаткові джерела==
* [http://docs.oracle.com/javase/tutorial/essential/exceptions/index.html Урок: Винятки // Java посібники на сайті Oracle (англ)]
==Примітки==
<references/>
(даний розділ незавершений, потребує доповнення. Необхідно дописати: отримання інформації про винятки, зчеплення винятків, створення власних)
[[Категорія:Освоюємо Java]]
{{Гортання сторінок|Об'єкти і класи|Графічний інтерфейс користувача}}
gmcgiwsf7y6oq8uaypas3bw3bkrqvs1
36905
36904
2022-08-06T19:30:35Z
Володимир Груша
985
/* Конструкція try */
wikitext
text/x-wiki
'''Виняткова ситуація''' або просто '''виняток''' (англ. exception) – це аварійний стан, який відбувається саме під час виконання програми. Прикладом є — ділення на нуль, помилки читання з файлу та мережі тощо. Іншими словами – це помилки які можуть виникнути при виконанні програми. В ряді мов програмування необхідно заздалегідь передбачити можливість тієї чи іншої помилки і передбачити шлях її обробки. В java для цього передбачений спеціальний механізм винятків.
==Винятки в java==
Виняток в java – це об'єкт, який описує виняткову (тобто, помилкову) ситуацію, що відбулась в певному місці коду. Коли така ситуація виникає створюється об'єкт, який передається («вкидається») в метод, в якому виникла помилка. Далі в методі даний виняток може оброблятися, або бути переданий ще кудись для обробки.
Розглянемо для прикладу наступну програму '''DivZero.java'''
<syntaxhighlight lang="java">
public class DivZero {
public static void main(String[] args) {
int my = 0;
int medium = 44 / my;
System.out.println("medium=" + medium);
}
}
</syntaxhighlight>
Як бачимо в програмі присутнє ділення на нуль. При компіляції ми не отримаємо помилок. Проте, після запуску програми, отримаємо наступне:
<pre>
Exception in thread "main" java.lang.ArithmeticException: / by zero
at DivZero.main(DivZero.java:4)
</pre>
Це так звана ''траса стеку викликів''. Перший рядок означає тип-винятку. Як бачимо тут маємо ArithmeticException з діленням на нуль. java.lang – це пакет класів, який завжди доступний в програмі і який містить найбільш використовувані класи. Тобто його не потрібно імпортувати. Другий рядок вказує де саме відбулась виняткова ситуація: 4-й рядок у файлі DivZero.java в методі main() класу DivZero. При цьому як бачимо програма завершила своє виконання аварійно. Для уникнення цього існує відповідний механізм обробки винятків, який дозволяє перехопити виняток, одержати інформацію про нього, обробити його здійснивши певні дії для нормального закінчення або продовження виконання програми.
==Типи винятків==
Усі типи винятків є підкласами класу '''Throwable''', який входить в базовий пакет класів Java - java.lang. Тобто він є вершиною ієрархії класів винятків. Його два підкласи '''Error''' та '''Exception''' утворюють дві основні гілки винятків.
Клас Error з його підкласами - це помилки виконавчого середовища java. І які зазвичай не виникають при нормальній роботі середовища java. Такі винятки зазвичай не можуть бути оброблені в програмі.
Гілка класу Exception - це винятки, які програма повинна вловлювати(catch). Від даного класу та його підкласів можна утворювати власні підкласи. Важливим його підкласом є клас '''RuntimeException'''. Винятки даного типу включають такі винятки як ділення на нуль та помилкова індексація масивів.
Актуальну ієрархію класів винятків можна подивитися і уточнити в офіційній документації до JDK<ref>[http://docs.oracle.com/javase/7/docs/api/index.html Java™ Platform, Standard Edition 7 API Specification (Натисніть TREE для перегляду ієрархії класів)]</ref>.
==Конструкція try==
Для обробки виняткових ситуацій використовується п’ять ключових слів: try, catch, throw, throws та finally.
Інструкції програми, в яких може виникнути помилка, контролюються за допомогою конструкції try.
Загальна форма наступна:
<pre>
try{
//блок коду для контролю над помилками
} catch (тип-винятку1 об’єкт-винятку) {
//дії при виникненні типу винятку1 (обробник винятку)
} catch (тип-винятку2 об’єкт-винятку) {
//дії при виникненні типу винятку2 (обробник винятку)
}
//….
[finally{
//дії при виході з конструкції try.
}]
</pre>
Після інструкції try ми розміщуємо «небезпечний» код, у блоці catch відбувається обробка винятку, причому може бути кілька інструкцій catch. Завершувати конструкцію може інструкція finally, в ній розміщується код, який буде виконаний після обробки винятку в інструкції catch.
Починаючи з java 7 стало можливим обробити два різнотипні винятки в одному блоці catch:
<code>
catch (FileNotFoundException | UnknownHostException е) {
// дії при обробці винятків
}
</code>
Так слід робити, якщо винятки не є підкласами один для іншого.
Таким чином можемо переписати програму з діленням на нуль:
<syntaxhighlight lang=java>
public class DivZero {
public static void main(String args[]){
int my=0;
try{
int medium=44/my;
System.out.println("medium="+medium);
}catch(ArithmeticException e){
System.out.println("Ділення на нуль!");
}
System.out.println("Продовження виконання...");
}
}
</syntaxhighlight>
Результат виконання:
<pre>Ділення на нуль!
Продовження виконання...</pre>
Як бачимо, для перехоплення винятку, код, через який виникала помилка, знаходиться у середині конструкції try. Також, зверніть увагу, що після виникнення виняткової ситуації наступний рядок ''System.out.println("medium="+medium);'' не було виведено, оскільки виняток був переданий для обробки в catch. Після інструкції програми в якій відбулась виняткова ситуація, всі наступні рядки до інструкції catch пропускаються і не будуть виконуватись. І, як бачимо з результату виконання, наша програма продовжила виконання по закінченню блоку try, а не завершила своє виконання аварійно.
===try з ресурсами===
При використанні всередині try певних ресурсів, наприклад, файлів, при виникненні винятку необхідно було передбачити закриття відкритих ресурсів. Для цієї мети раніше приходилося використовувати блок finally. У Java 7 з'явилася конструкція try з ресурсами (англ. try-with-resources)<ref>[https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html The try-with-resources Statement]</ref>. Тепер просто можна створити ресурс у дужках зразу ж після ключового слова try і java сама потурбується про закриття ресурсу. Приклад:
<syntaxhighlight lang="java">
static String readFirstLineFromFile(String path) throws IOException {
try (BufferedReader br =
new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}</syntaxhighlight>
==Throw==
В наведених вище прикладах ми здійснювали лише обробку винятків викинутих виконавчим середовищем java. Проте існує можливість викидання власних винятків. Для цього існує інструкція Throw. Загальна форма її наступна:
<pre>
throw ThrowableInstance;
</pre>
Тут ThrowableInstance – це тип винятку, який повинен бути або типом Throwable, або мати тип його підкласів. Щоб програма викинула ваш виняток необхідно скористатися оператором new. Для того, щоб одержати(перехопити) тип винятку можна скористатися інструкцією catch, як це ми робили вище.
Після інструкції throw відбувається аналогічне породження винятку як у вище наведених прикладах. Тобто усі інструкції пропускаються до найближчого блоку інструкції catch, де необхідно здійснити обробку винятку. Якщо catch не буде знайдено, то обробник винятків, що використовується по замовчуванню, призупиняє виконання програми і друкує відбиток стеку (stack trace).
Приклад:
<syntaxhighlight lang="java">
public class ThrowNullException {
public static void main(String args[]){
try{
throw new NullPointerException("Пробний виняток");
}catch(Exception e){
System.out.println("Наш витяток: "+e);
}
}
}
</syntaxhighlight>
Результат:
<pre>
Наш витяток: java.lang.NullPointerException: Пробний виняток
</pre>
Програма демонструє як створювати один із стандартних винятків. Більшість вбудованих run-time винятків Java мають щонайменше два конструктори. Один за замовчуванням без параметрів і один із параметром String, який дозволяє задати додатковий опис. Опис можна вивести на консоль за допомогою методів '''print(), println()'''. Також його можна отримати використавши метод '''getMessage()''' класу Throwable.
Можна створити власний тип винятку як підклас уже існуючого типу.
==Throws==
Якщо метод породжує виняток і не обробляє його, то він повинен вказати про це, щоб обробка винятку була здійснена у місці виклику даного методу. Це здійснюється за допомогою застереження throws в оголошенні методу. Після нього вказується підряд через кому усі винятки, які можуть бути викинуті методом, окрім винятків класів Error та RuntimeException і їхніх підкласів. Нагадаємо, що клас Error – це необроблювані винятки, RuntimeException – винятки, які виникають в результаті помилки програміста (вихід за межі масиву, нульове посилання, невірне перетворення типів). Інші винятки – це помилки доступу, які доволі часто вимагають відповідної обробки.
Загальна форма оголошення методу наступна:
<pre>
тип ім’я_методу(список_параметрів) throws список_винятків
{
// тіло методу
}
</pre>
Наступна програма демонструє використання throws у методі де виникає виняток IllegalAccessException.
<syntaxhighlight lang="java">
public class ThrowsException {
public static void exceptionMethod () throws IllegalAccessException{
System.out.println("Всередині exceptionMethod().");
throw new IllegalAccessException("Помилка доступу");
}
public static void main(String args[]){
try{
exceptionMethod();
System.out.println("Кінець програми"); //даний рядок не буде виведений
}catch(IllegalAccessException e){
System.out.println("Наш витяток: "+e);
}
}
}
</syntaxhighlight>
Результат:
<pre>
Всередині ExceptionMethod().
Наш витяток: java.lang.IllegalAccessException: Помилка доступу
</pre>
Як бачимо тепер обробка винятку відбувається у методі main(). Без інструкції try-catch програма призупинятиметься з друком відбитку стеку. Слід зауважити, що у методах інструкція throw поводить себе подібно до інструкції return. Тобто виконання методу припиняється і відбувається повернення в місце виклику методу.
Інструкцію throws не можливо використати при заміщенні методу в класах нащадках, якщо метод батьківського класу не викидав виняток. Тож відповідний метод класу нащадку не викидатиме виняток.
==Створення власних винятків==
Якщо вам не підходить жоден з існуючих класів винятків, то можна створити власний. Він повинен розширювати клас Exception, або будь-який із похідних класів.
<syntaxhighlight lang="java">
package exceptions;
import java.io.IOException;
class FileFormatException extends IOException
{
public FileFormatException () {} // конструктор по замовчуванню
public FileFormatException(String gripe) // конструктор, що забезпечує повернення зазначеного повідомлення
{
super(gripe);
}
}
</syntaxhighlight>
Тепер в коді, що повинен породжувати виняток можна вставити викидання даного винятку:<code>throw new FileFormatException(); </code>.
<syntaxhighlight lang="java">
package exceptions;
public class TestNewException {
public static void main(String[] args) {
try {
throw new FileFormatException("Не той формат файлу");
} catch (Exception e) {
System.out.println("Повідомлення винятку: "+e.getMessage());
}
}
}
</syntaxhighlight>
Результат:
<pre>
Повідомлення винятку: Не той формат файлу
</pre>
==Додаткові джерела==
* [http://docs.oracle.com/javase/tutorial/essential/exceptions/index.html Урок: Винятки // Java посібники на сайті Oracle (англ)]
==Примітки==
<references/>
(даний розділ незавершений, потребує доповнення. Необхідно дописати: отримання інформації про винятки, зчеплення винятків, створення власних)
[[Категорія:Освоюємо Java]]
{{Гортання сторінок|Об'єкти і класи|Графічний інтерфейс користувача}}
pa6fgmcnnqi6442ziw0d10qwgqi0yjo
36906
36905
2022-08-06T19:39:21Z
Володимир Груша
985
/* Конструкція try */
wikitext
text/x-wiki
'''Виняткова ситуація''' або просто '''виняток''' (англ. exception) – це аварійний стан, який відбувається саме під час виконання програми. Прикладом є — ділення на нуль, помилки читання з файлу та мережі тощо. Іншими словами – це помилки які можуть виникнути при виконанні програми. В ряді мов програмування необхідно заздалегідь передбачити можливість тієї чи іншої помилки і передбачити шлях її обробки. В java для цього передбачений спеціальний механізм винятків.
==Винятки в java==
Виняток в java – це об'єкт, який описує виняткову (тобто, помилкову) ситуацію, що відбулась в певному місці коду. Коли така ситуація виникає створюється об'єкт, який передається («вкидається») в метод, в якому виникла помилка. Далі в методі даний виняток може оброблятися, або бути переданий ще кудись для обробки.
Розглянемо для прикладу наступну програму '''DivZero.java'''
<syntaxhighlight lang="java">
public class DivZero {
public static void main(String[] args) {
int my = 0;
int medium = 44 / my;
System.out.println("medium=" + medium);
}
}
</syntaxhighlight>
Як бачимо в програмі присутнє ділення на нуль. При компіляції ми не отримаємо помилок. Проте, після запуску програми, отримаємо наступне:
<pre>
Exception in thread "main" java.lang.ArithmeticException: / by zero
at DivZero.main(DivZero.java:4)
</pre>
Це так звана ''траса стеку викликів''. Перший рядок означає тип-винятку. Як бачимо тут маємо ArithmeticException з діленням на нуль. java.lang – це пакет класів, який завжди доступний в програмі і який містить найбільш використовувані класи. Тобто його не потрібно імпортувати. Другий рядок вказує де саме відбулась виняткова ситуація: 4-й рядок у файлі DivZero.java в методі main() класу DivZero. При цьому як бачимо програма завершила своє виконання аварійно. Для уникнення цього існує відповідний механізм обробки винятків, який дозволяє перехопити виняток, одержати інформацію про нього, обробити його здійснивши певні дії для нормального закінчення або продовження виконання програми.
==Типи винятків==
Усі типи винятків є підкласами класу '''Throwable''', який входить в базовий пакет класів Java - java.lang. Тобто він є вершиною ієрархії класів винятків. Його два підкласи '''Error''' та '''Exception''' утворюють дві основні гілки винятків.
Клас Error з його підкласами - це помилки виконавчого середовища java. І які зазвичай не виникають при нормальній роботі середовища java. Такі винятки зазвичай не можуть бути оброблені в програмі.
Гілка класу Exception - це винятки, які програма повинна вловлювати(catch). Від даного класу та його підкласів можна утворювати власні підкласи. Важливим його підкласом є клас '''RuntimeException'''. Винятки даного типу включають такі винятки як ділення на нуль та помилкова індексація масивів.
Актуальну ієрархію класів винятків можна подивитися і уточнити в офіційній документації до JDK<ref>[http://docs.oracle.com/javase/7/docs/api/index.html Java™ Platform, Standard Edition 7 API Specification (Натисніть TREE для перегляду ієрархії класів)]</ref>.
==Конструкція try==
Для обробки виняткових ситуацій використовується п’ять ключових слів: try, catch, throw, throws та finally.
Інструкції програми, в яких може виникнути помилка, контролюються за допомогою конструкції try.
Загальна форма наступна:
<pre>
try{
//блок коду для контролю над помилками
} catch (тип-винятку1 об’єкт-винятку) {
//дії при виникненні типу винятку1 (обробник винятку)
} catch (тип-винятку2 об’єкт-винятку) {
//дії при виникненні типу винятку2 (обробник винятку)
}
//….
[finally{
//дії при виході з конструкції try.
}]
</pre>
Після інструкції try ми розміщуємо «небезпечний» код, у блоці catch відбувається обробка винятку, причому може бути кілька інструкцій catch. При використанні кількох інструкцій catch необхідно зважати на ієрархію класів винятків. Класи нащадки повинні оброблятися раніше за батьківські класи. Інакше обробка конкретного винятку просто буде неможлива, оскільки першим буде викликаний catch з батьківським класом (див. поліморфізм) і до нащадків діло не дійде. Завершувати конструкцію може інструкція finally, в ній розміщується код, який буде виконаний після обробки винятку в інструкції catch.
Починаючи з java 7 стало можливим обробити два різнотипні винятки в одному блоці catch:
<code>
catch (FileNotFoundException | UnknownHostException е) {
// дії при обробці винятків
}
</code>
Так слід робити, якщо винятки не є підкласами один для іншого.
Таким чином можемо переписати програму з діленням на нуль:
<syntaxhighlight lang=java>
public class DivZero {
public static void main(String args[]){
int my=0;
try{
int medium=44/my;
System.out.println("medium="+medium);
}catch(ArithmeticException e){
System.out.println("Ділення на нуль!");
}
System.out.println("Продовження виконання...");
}
}
</syntaxhighlight>
Результат виконання:
<pre>Ділення на нуль!
Продовження виконання...</pre>
Як бачимо, для перехоплення винятку, код, через який виникала помилка, знаходиться у середині конструкції try. Також, зверніть увагу, що після виникнення виняткової ситуації наступний рядок ''System.out.println("medium="+medium);'' не було виведено, оскільки виняток був переданий для обробки в catch. Після інструкції програми в якій відбулась виняткова ситуація, всі наступні рядки до інструкції catch пропускаються і не будуть виконуватись. І, як бачимо з результату виконання, наша програма продовжила виконання по закінченню блоку try, а не завершила своє виконання аварійно.
===try з ресурсами===
При використанні всередині try певних ресурсів, наприклад, файлів, при виникненні винятку необхідно було передбачити закриття відкритих ресурсів. Для цієї мети раніше приходилося використовувати блок finally. У Java 7 з'явилася конструкція try з ресурсами (англ. try-with-resources)<ref>[https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html The try-with-resources Statement]</ref>. Тепер просто можна створити ресурс у дужках зразу ж після ключового слова try і java сама потурбується про закриття ресурсу. Приклад:
<syntaxhighlight lang="java">
static String readFirstLineFromFile(String path) throws IOException {
try (BufferedReader br =
new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}</syntaxhighlight>
==Throw==
В наведених вище прикладах ми здійснювали лише обробку винятків викинутих виконавчим середовищем java. Проте існує можливість викидання власних винятків. Для цього існує інструкція Throw. Загальна форма її наступна:
<pre>
throw ThrowableInstance;
</pre>
Тут ThrowableInstance – це тип винятку, який повинен бути або типом Throwable, або мати тип його підкласів. Щоб програма викинула ваш виняток необхідно скористатися оператором new. Для того, щоб одержати(перехопити) тип винятку можна скористатися інструкцією catch, як це ми робили вище.
Після інструкції throw відбувається аналогічне породження винятку як у вище наведених прикладах. Тобто усі інструкції пропускаються до найближчого блоку інструкції catch, де необхідно здійснити обробку винятку. Якщо catch не буде знайдено, то обробник винятків, що використовується по замовчуванню, призупиняє виконання програми і друкує відбиток стеку (stack trace).
Приклад:
<syntaxhighlight lang="java">
public class ThrowNullException {
public static void main(String args[]){
try{
throw new NullPointerException("Пробний виняток");
}catch(Exception e){
System.out.println("Наш витяток: "+e);
}
}
}
</syntaxhighlight>
Результат:
<pre>
Наш витяток: java.lang.NullPointerException: Пробний виняток
</pre>
Програма демонструє як створювати один із стандартних винятків. Більшість вбудованих run-time винятків Java мають щонайменше два конструктори. Один за замовчуванням без параметрів і один із параметром String, який дозволяє задати додатковий опис. Опис можна вивести на консоль за допомогою методів '''print(), println()'''. Також його можна отримати використавши метод '''getMessage()''' класу Throwable.
Можна створити власний тип винятку як підклас уже існуючого типу.
==Throws==
Якщо метод породжує виняток і не обробляє його, то він повинен вказати про це, щоб обробка винятку була здійснена у місці виклику даного методу. Це здійснюється за допомогою застереження throws в оголошенні методу. Після нього вказується підряд через кому усі винятки, які можуть бути викинуті методом, окрім винятків класів Error та RuntimeException і їхніх підкласів. Нагадаємо, що клас Error – це необроблювані винятки, RuntimeException – винятки, які виникають в результаті помилки програміста (вихід за межі масиву, нульове посилання, невірне перетворення типів). Інші винятки – це помилки доступу, які доволі часто вимагають відповідної обробки.
Загальна форма оголошення методу наступна:
<pre>
тип ім’я_методу(список_параметрів) throws список_винятків
{
// тіло методу
}
</pre>
Наступна програма демонструє використання throws у методі де виникає виняток IllegalAccessException.
<syntaxhighlight lang="java">
public class ThrowsException {
public static void exceptionMethod () throws IllegalAccessException{
System.out.println("Всередині exceptionMethod().");
throw new IllegalAccessException("Помилка доступу");
}
public static void main(String args[]){
try{
exceptionMethod();
System.out.println("Кінець програми"); //даний рядок не буде виведений
}catch(IllegalAccessException e){
System.out.println("Наш витяток: "+e);
}
}
}
</syntaxhighlight>
Результат:
<pre>
Всередині ExceptionMethod().
Наш витяток: java.lang.IllegalAccessException: Помилка доступу
</pre>
Як бачимо тепер обробка винятку відбувається у методі main(). Без інструкції try-catch програма призупинятиметься з друком відбитку стеку. Слід зауважити, що у методах інструкція throw поводить себе подібно до інструкції return. Тобто виконання методу припиняється і відбувається повернення в місце виклику методу.
Інструкцію throws не можливо використати при заміщенні методу в класах нащадках, якщо метод батьківського класу не викидав виняток. Тож відповідний метод класу нащадку не викидатиме виняток.
==Створення власних винятків==
Якщо вам не підходить жоден з існуючих класів винятків, то можна створити власний. Він повинен розширювати клас Exception, або будь-який із похідних класів.
<syntaxhighlight lang="java">
package exceptions;
import java.io.IOException;
class FileFormatException extends IOException
{
public FileFormatException () {} // конструктор по замовчуванню
public FileFormatException(String gripe) // конструктор, що забезпечує повернення зазначеного повідомлення
{
super(gripe);
}
}
</syntaxhighlight>
Тепер в коді, що повинен породжувати виняток можна вставити викидання даного винятку:<code>throw new FileFormatException(); </code>.
<syntaxhighlight lang="java">
package exceptions;
public class TestNewException {
public static void main(String[] args) {
try {
throw new FileFormatException("Не той формат файлу");
} catch (Exception e) {
System.out.println("Повідомлення винятку: "+e.getMessage());
}
}
}
</syntaxhighlight>
Результат:
<pre>
Повідомлення винятку: Не той формат файлу
</pre>
==Додаткові джерела==
* [http://docs.oracle.com/javase/tutorial/essential/exceptions/index.html Урок: Винятки // Java посібники на сайті Oracle (англ)]
==Примітки==
<references/>
(даний розділ незавершений, потребує доповнення. Необхідно дописати: отримання інформації про винятки, зчеплення винятків, створення власних)
[[Категорія:Освоюємо Java]]
{{Гортання сторінок|Об'єкти і класи|Графічний інтерфейс користувача}}
myq23lcouldq5q2xyflhp1syxo1hbvt
36907
36906
2022-08-06T19:40:09Z
Володимир Груша
985
/* Конструкція try */
wikitext
text/x-wiki
'''Виняткова ситуація''' або просто '''виняток''' (англ. exception) – це аварійний стан, який відбувається саме під час виконання програми. Прикладом є — ділення на нуль, помилки читання з файлу та мережі тощо. Іншими словами – це помилки які можуть виникнути при виконанні програми. В ряді мов програмування необхідно заздалегідь передбачити можливість тієї чи іншої помилки і передбачити шлях її обробки. В java для цього передбачений спеціальний механізм винятків.
==Винятки в java==
Виняток в java – це об'єкт, який описує виняткову (тобто, помилкову) ситуацію, що відбулась в певному місці коду. Коли така ситуація виникає створюється об'єкт, який передається («вкидається») в метод, в якому виникла помилка. Далі в методі даний виняток може оброблятися, або бути переданий ще кудись для обробки.
Розглянемо для прикладу наступну програму '''DivZero.java'''
<syntaxhighlight lang="java">
public class DivZero {
public static void main(String[] args) {
int my = 0;
int medium = 44 / my;
System.out.println("medium=" + medium);
}
}
</syntaxhighlight>
Як бачимо в програмі присутнє ділення на нуль. При компіляції ми не отримаємо помилок. Проте, після запуску програми, отримаємо наступне:
<pre>
Exception in thread "main" java.lang.ArithmeticException: / by zero
at DivZero.main(DivZero.java:4)
</pre>
Це так звана ''траса стеку викликів''. Перший рядок означає тип-винятку. Як бачимо тут маємо ArithmeticException з діленням на нуль. java.lang – це пакет класів, який завжди доступний в програмі і який містить найбільш використовувані класи. Тобто його не потрібно імпортувати. Другий рядок вказує де саме відбулась виняткова ситуація: 4-й рядок у файлі DivZero.java в методі main() класу DivZero. При цьому як бачимо програма завершила своє виконання аварійно. Для уникнення цього існує відповідний механізм обробки винятків, який дозволяє перехопити виняток, одержати інформацію про нього, обробити його здійснивши певні дії для нормального закінчення або продовження виконання програми.
==Типи винятків==
Усі типи винятків є підкласами класу '''Throwable''', який входить в базовий пакет класів Java - java.lang. Тобто він є вершиною ієрархії класів винятків. Його два підкласи '''Error''' та '''Exception''' утворюють дві основні гілки винятків.
Клас Error з його підкласами - це помилки виконавчого середовища java. І які зазвичай не виникають при нормальній роботі середовища java. Такі винятки зазвичай не можуть бути оброблені в програмі.
Гілка класу Exception - це винятки, які програма повинна вловлювати(catch). Від даного класу та його підкласів можна утворювати власні підкласи. Важливим його підкласом є клас '''RuntimeException'''. Винятки даного типу включають такі винятки як ділення на нуль та помилкова індексація масивів.
Актуальну ієрархію класів винятків можна подивитися і уточнити в офіційній документації до JDK<ref>[http://docs.oracle.com/javase/7/docs/api/index.html Java™ Platform, Standard Edition 7 API Specification (Натисніть TREE для перегляду ієрархії класів)]</ref>.
==Конструкція try==
Для обробки виняткових ситуацій використовується п’ять ключових слів: try, catch, throw, throws та finally.
Інструкції програми, в яких може виникнути помилка, контролюються за допомогою конструкції try.
Загальна форма наступна:
<pre>
try{
//блок коду для контролю над помилками
} catch (тип-винятку1 об’єкт-винятку) {
//дії при виникненні типу винятку1 (обробник винятку)
} catch (тип-винятку2 об’єкт-винятку) {
//дії при виникненні типу винятку2 (обробник винятку)
}
//….
[finally{
//дії при виході з конструкції try.
}]
</pre>
Після інструкції try ми розміщуємо «небезпечний» код, у блоці catch відбувається обробка винятку, причому може бути кілька інструкцій catch. При використанні кількох інструкцій catch необхідно зважати на ієрархію класів винятків. Класи нащадки повинні оброблятися раніше за батьківські класи. Інакше обробка конкретного винятку просто буде неможлива, оскільки першим буде викликаний catch з батьківським класом (див. поліморфізм) і до нащадків діло не дійде. Завершувати конструкцію може інструкція finally, в ній розміщується код, який буде виконаний після обробки винятку в інструкції catch.
Починаючи з java 7 стало можливим обробити два різнотипні винятки в одному блоці catch:
<code>
catch (FileNotFoundException | UnknownHostException е) {
// дії при обробці винятків
}
</code>
Так слід робити, якщо винятки не є підкласами один для іншого.
Таким чином можемо переписати програму з діленням на нуль:
<syntaxhighlight lang=java>
public class DivZero {
public static void main(String args[]){
int my=0;
try{
int medium=44/my;
System.out.println("medium="+medium);
}catch(ArithmeticException e){
System.out.println("Ділення на нуль!");
}
System.out.println("Продовження виконання...");
}
}
</syntaxhighlight>
Результат виконання:
<pre>Ділення на нуль!
Продовження виконання...</pre>
Як бачимо, для перехоплення винятку, код, через який виникала помилка, знаходиться у середині конструкції try. Також, зверніть увагу, що після виникнення виняткової ситуації наступний рядок ''System.out.println("medium="+medium);'' не було виведено, оскільки виняток був переданий для обробки в catch. Після інструкції програми в якій відбулась виняткова ситуація, всі наступні рядки до інструкції catch пропускаються і не будуть виконуватись. І, як бачимо з результату виконання, наша програма продовжила виконання по закінченню блоку try, а не завершила своє виконання аварійно.
===try з ресурсами===
При використанні всередині try певних ресурсів, наприклад, файлів, при виникненні винятку необхідно було передбачити закриття відкритих ресурсів. Для цієї мети раніше приходилося використовувати блок finally. У Java 7 з'явилася конструкція try з ресурсами (англ. try-with-resources)<ref>[https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html The try-with-resources Statement]</ref>. Тепер просто можна створити ресурс у дужках зразу ж після ключового слова try і java сама потурбується про закриття ресурсу. Приклад:
<syntaxhighlight lang="java">
static String readFirstLineFromFile(String path) throws IOException {
try (BufferedReader br =
new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}</syntaxhighlight>
==Throw==
В наведених вище прикладах ми здійснювали лише обробку винятків викинутих виконавчим середовищем java. Проте існує можливість викидання власних винятків. Для цього існує інструкція Throw. Загальна форма її наступна:
<pre>
throw ThrowableInstance;
</pre>
Тут ThrowableInstance – це тип винятку, який повинен бути або типом Throwable, або мати тип його підкласів. Щоб програма викинула ваш виняток необхідно скористатися оператором new. Для того, щоб одержати(перехопити) тип винятку можна скористатися інструкцією catch, як це ми робили вище.
Після інструкції throw відбувається аналогічне породження винятку як у вище наведених прикладах. Тобто усі інструкції пропускаються до найближчого блоку інструкції catch, де необхідно здійснити обробку винятку. Якщо catch не буде знайдено, то обробник винятків, що використовується по замовчуванню, призупиняє виконання програми і друкує відбиток стеку (stack trace).
Приклад:
<syntaxhighlight lang="java">
public class ThrowNullException {
public static void main(String args[]){
try{
throw new NullPointerException("Пробний виняток");
}catch(Exception e){
System.out.println("Наш витяток: "+e);
}
}
}
</syntaxhighlight>
Результат:
<pre>
Наш витяток: java.lang.NullPointerException: Пробний виняток
</pre>
Програма демонструє як створювати один із стандартних винятків. Більшість вбудованих run-time винятків Java мають щонайменше два конструктори. Один за замовчуванням без параметрів і один із параметром String, який дозволяє задати додатковий опис. Опис можна вивести на консоль за допомогою методів '''print(), println()'''. Також його можна отримати використавши метод '''getMessage()''' класу Throwable.
Можна створити власний тип винятку як підклас уже існуючого типу.
==Throws==
Якщо метод породжує виняток і не обробляє його, то він повинен вказати про це, щоб обробка винятку була здійснена у місці виклику даного методу. Це здійснюється за допомогою застереження throws в оголошенні методу. Після нього вказується підряд через кому усі винятки, які можуть бути викинуті методом, окрім винятків класів Error та RuntimeException і їхніх підкласів. Нагадаємо, що клас Error – це необроблювані винятки, RuntimeException – винятки, які виникають в результаті помилки програміста (вихід за межі масиву, нульове посилання, невірне перетворення типів). Інші винятки – це помилки доступу, які доволі часто вимагають відповідної обробки.
Загальна форма оголошення методу наступна:
<pre>
тип ім’я_методу(список_параметрів) throws список_винятків
{
// тіло методу
}
</pre>
Наступна програма демонструє використання throws у методі де виникає виняток IllegalAccessException.
<syntaxhighlight lang="java">
public class ThrowsException {
public static void exceptionMethod () throws IllegalAccessException{
System.out.println("Всередині exceptionMethod().");
throw new IllegalAccessException("Помилка доступу");
}
public static void main(String args[]){
try{
exceptionMethod();
System.out.println("Кінець програми"); //даний рядок не буде виведений
}catch(IllegalAccessException e){
System.out.println("Наш витяток: "+e);
}
}
}
</syntaxhighlight>
Результат:
<pre>
Всередині ExceptionMethod().
Наш витяток: java.lang.IllegalAccessException: Помилка доступу
</pre>
Як бачимо тепер обробка винятку відбувається у методі main(). Без інструкції try-catch програма призупинятиметься з друком відбитку стеку. Слід зауважити, що у методах інструкція throw поводить себе подібно до інструкції return. Тобто виконання методу припиняється і відбувається повернення в місце виклику методу.
Інструкцію throws не можливо використати при заміщенні методу в класах нащадках, якщо метод батьківського класу не викидав виняток. Тож відповідний метод класу нащадку не викидатиме виняток.
==Створення власних винятків==
Якщо вам не підходить жоден з існуючих класів винятків, то можна створити власний. Він повинен розширювати клас Exception, або будь-який із похідних класів.
<syntaxhighlight lang="java">
package exceptions;
import java.io.IOException;
class FileFormatException extends IOException
{
public FileFormatException () {} // конструктор по замовчуванню
public FileFormatException(String gripe) // конструктор, що забезпечує повернення зазначеного повідомлення
{
super(gripe);
}
}
</syntaxhighlight>
Тепер в коді, що повинен породжувати виняток можна вставити викидання даного винятку:<code>throw new FileFormatException(); </code>.
<syntaxhighlight lang="java">
package exceptions;
public class TestNewException {
public static void main(String[] args) {
try {
throw new FileFormatException("Не той формат файлу");
} catch (Exception e) {
System.out.println("Повідомлення винятку: "+e.getMessage());
}
}
}
</syntaxhighlight>
Результат:
<pre>
Повідомлення винятку: Не той формат файлу
</pre>
==Додаткові джерела==
* [http://docs.oracle.com/javase/tutorial/essential/exceptions/index.html Урок: Винятки // Java посібники на сайті Oracle (англ)]
==Примітки==
<references/>
(даний розділ незавершений, потребує доповнення. Необхідно дописати: отримання інформації про винятки, зчеплення винятків, створення власних)
[[Категорія:Освоюємо Java]]
{{Гортання сторінок|Об'єкти і класи|Графічний інтерфейс користувача}}
hrmcvfossm5jclsrgcg4p8orop94uno
36908
36907
2022-08-06T19:40:42Z
Володимир Груша
985
/* Конструкція try */
wikitext
text/x-wiki
'''Виняткова ситуація''' або просто '''виняток''' (англ. exception) – це аварійний стан, який відбувається саме під час виконання програми. Прикладом є — ділення на нуль, помилки читання з файлу та мережі тощо. Іншими словами – це помилки які можуть виникнути при виконанні програми. В ряді мов програмування необхідно заздалегідь передбачити можливість тієї чи іншої помилки і передбачити шлях її обробки. В java для цього передбачений спеціальний механізм винятків.
==Винятки в java==
Виняток в java – це об'єкт, який описує виняткову (тобто, помилкову) ситуацію, що відбулась в певному місці коду. Коли така ситуація виникає створюється об'єкт, який передається («вкидається») в метод, в якому виникла помилка. Далі в методі даний виняток може оброблятися, або бути переданий ще кудись для обробки.
Розглянемо для прикладу наступну програму '''DivZero.java'''
<syntaxhighlight lang="java">
public class DivZero {
public static void main(String[] args) {
int my = 0;
int medium = 44 / my;
System.out.println("medium=" + medium);
}
}
</syntaxhighlight>
Як бачимо в програмі присутнє ділення на нуль. При компіляції ми не отримаємо помилок. Проте, після запуску програми, отримаємо наступне:
<pre>
Exception in thread "main" java.lang.ArithmeticException: / by zero
at DivZero.main(DivZero.java:4)
</pre>
Це так звана ''траса стеку викликів''. Перший рядок означає тип-винятку. Як бачимо тут маємо ArithmeticException з діленням на нуль. java.lang – це пакет класів, який завжди доступний в програмі і який містить найбільш використовувані класи. Тобто його не потрібно імпортувати. Другий рядок вказує де саме відбулась виняткова ситуація: 4-й рядок у файлі DivZero.java в методі main() класу DivZero. При цьому як бачимо програма завершила своє виконання аварійно. Для уникнення цього існує відповідний механізм обробки винятків, який дозволяє перехопити виняток, одержати інформацію про нього, обробити його здійснивши певні дії для нормального закінчення або продовження виконання програми.
==Типи винятків==
Усі типи винятків є підкласами класу '''Throwable''', який входить в базовий пакет класів Java - java.lang. Тобто він є вершиною ієрархії класів винятків. Його два підкласи '''Error''' та '''Exception''' утворюють дві основні гілки винятків.
Клас Error з його підкласами - це помилки виконавчого середовища java. І які зазвичай не виникають при нормальній роботі середовища java. Такі винятки зазвичай не можуть бути оброблені в програмі.
Гілка класу Exception - це винятки, які програма повинна вловлювати(catch). Від даного класу та його підкласів можна утворювати власні підкласи. Важливим його підкласом є клас '''RuntimeException'''. Винятки даного типу включають такі винятки як ділення на нуль та помилкова індексація масивів.
Актуальну ієрархію класів винятків можна подивитися і уточнити в офіційній документації до JDK<ref>[http://docs.oracle.com/javase/7/docs/api/index.html Java™ Platform, Standard Edition 7 API Specification (Натисніть TREE для перегляду ієрархії класів)]</ref>.
==Конструкція try==
Для обробки виняткових ситуацій використовується п’ять ключових слів: try, catch, throw, throws та finally.
Інструкції програми, в яких може виникнути помилка, контролюються за допомогою конструкції try.
Загальна форма наступна:
<pre>
try{
//блок коду для контролю над помилками
} catch (тип-винятку1 об’єкт-винятку) {
//дії при виникненні типу винятку1 (обробник винятку)
} catch (тип-винятку2 об’єкт-винятку) {
//дії при виникненні типу винятку2 (обробник винятку)
}
//….
[finally{
//дії при виході з конструкції try.
}]
</pre>
Після інструкції try ми розміщуємо «небезпечний» код, у блоці catch відбувається обробка винятку, причому може бути кілька інструкцій catch. При використанні кількох інструкцій catch необхідно зважати на ієрархію класів винятків. Класи нащадки повинні оброблятися раніше за батьківські класи. Інакше обробка конкретного винятку просто буде неможлива, оскільки першим буде викликаний catch з батьківським класом (див. поліморфізм) і до нащадків діло не дійде. Завершувати конструкцію може інструкція finally, в ній розміщується код, який буде виконаний після обробки винятку в інструкції catch.
Починаючи з java 7 стало можливим обробити два різнотипні винятки в одному блоці catch:
<pre>
catch (FileNotFoundException | UnknownHostException е) {
// дії при обробці винятків
}
</pre>
Так слід робити, якщо винятки не є підкласами один для іншого.
Таким чином можемо переписати програму з діленням на нуль:
<syntaxhighlight lang=java>
public class DivZero {
public static void main(String args[]){
int my=0;
try{
int medium=44/my;
System.out.println("medium="+medium);
}catch(ArithmeticException e){
System.out.println("Ділення на нуль!");
}
System.out.println("Продовження виконання...");
}
}
</syntaxhighlight>
Результат виконання:
<pre>Ділення на нуль!
Продовження виконання...</pre>
Як бачимо, для перехоплення винятку, код, через який виникала помилка, знаходиться у середині конструкції try. Також, зверніть увагу, що після виникнення виняткової ситуації наступний рядок ''System.out.println("medium="+medium);'' не було виведено, оскільки виняток був переданий для обробки в catch. Після інструкції програми в якій відбулась виняткова ситуація, всі наступні рядки до інструкції catch пропускаються і не будуть виконуватись. І, як бачимо з результату виконання, наша програма продовжила виконання по закінченню блоку try, а не завершила своє виконання аварійно.
===try з ресурсами===
При використанні всередині try певних ресурсів, наприклад, файлів, при виникненні винятку необхідно було передбачити закриття відкритих ресурсів. Для цієї мети раніше приходилося використовувати блок finally. У Java 7 з'явилася конструкція try з ресурсами (англ. try-with-resources)<ref>[https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html The try-with-resources Statement]</ref>. Тепер просто можна створити ресурс у дужках зразу ж після ключового слова try і java сама потурбується про закриття ресурсу. Приклад:
<syntaxhighlight lang="java">
static String readFirstLineFromFile(String path) throws IOException {
try (BufferedReader br =
new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}</syntaxhighlight>
==Throw==
В наведених вище прикладах ми здійснювали лише обробку винятків викинутих виконавчим середовищем java. Проте існує можливість викидання власних винятків. Для цього існує інструкція Throw. Загальна форма її наступна:
<pre>
throw ThrowableInstance;
</pre>
Тут ThrowableInstance – це тип винятку, який повинен бути або типом Throwable, або мати тип його підкласів. Щоб програма викинула ваш виняток необхідно скористатися оператором new. Для того, щоб одержати(перехопити) тип винятку можна скористатися інструкцією catch, як це ми робили вище.
Після інструкції throw відбувається аналогічне породження винятку як у вище наведених прикладах. Тобто усі інструкції пропускаються до найближчого блоку інструкції catch, де необхідно здійснити обробку винятку. Якщо catch не буде знайдено, то обробник винятків, що використовується по замовчуванню, призупиняє виконання програми і друкує відбиток стеку (stack trace).
Приклад:
<syntaxhighlight lang="java">
public class ThrowNullException {
public static void main(String args[]){
try{
throw new NullPointerException("Пробний виняток");
}catch(Exception e){
System.out.println("Наш витяток: "+e);
}
}
}
</syntaxhighlight>
Результат:
<pre>
Наш витяток: java.lang.NullPointerException: Пробний виняток
</pre>
Програма демонструє як створювати один із стандартних винятків. Більшість вбудованих run-time винятків Java мають щонайменше два конструктори. Один за замовчуванням без параметрів і один із параметром String, який дозволяє задати додатковий опис. Опис можна вивести на консоль за допомогою методів '''print(), println()'''. Також його можна отримати використавши метод '''getMessage()''' класу Throwable.
Можна створити власний тип винятку як підклас уже існуючого типу.
==Throws==
Якщо метод породжує виняток і не обробляє його, то він повинен вказати про це, щоб обробка винятку була здійснена у місці виклику даного методу. Це здійснюється за допомогою застереження throws в оголошенні методу. Після нього вказується підряд через кому усі винятки, які можуть бути викинуті методом, окрім винятків класів Error та RuntimeException і їхніх підкласів. Нагадаємо, що клас Error – це необроблювані винятки, RuntimeException – винятки, які виникають в результаті помилки програміста (вихід за межі масиву, нульове посилання, невірне перетворення типів). Інші винятки – це помилки доступу, які доволі часто вимагають відповідної обробки.
Загальна форма оголошення методу наступна:
<pre>
тип ім’я_методу(список_параметрів) throws список_винятків
{
// тіло методу
}
</pre>
Наступна програма демонструє використання throws у методі де виникає виняток IllegalAccessException.
<syntaxhighlight lang="java">
public class ThrowsException {
public static void exceptionMethod () throws IllegalAccessException{
System.out.println("Всередині exceptionMethod().");
throw new IllegalAccessException("Помилка доступу");
}
public static void main(String args[]){
try{
exceptionMethod();
System.out.println("Кінець програми"); //даний рядок не буде виведений
}catch(IllegalAccessException e){
System.out.println("Наш витяток: "+e);
}
}
}
</syntaxhighlight>
Результат:
<pre>
Всередині ExceptionMethod().
Наш витяток: java.lang.IllegalAccessException: Помилка доступу
</pre>
Як бачимо тепер обробка винятку відбувається у методі main(). Без інструкції try-catch програма призупинятиметься з друком відбитку стеку. Слід зауважити, що у методах інструкція throw поводить себе подібно до інструкції return. Тобто виконання методу припиняється і відбувається повернення в місце виклику методу.
Інструкцію throws не можливо використати при заміщенні методу в класах нащадках, якщо метод батьківського класу не викидав виняток. Тож відповідний метод класу нащадку не викидатиме виняток.
==Створення власних винятків==
Якщо вам не підходить жоден з існуючих класів винятків, то можна створити власний. Він повинен розширювати клас Exception, або будь-який із похідних класів.
<syntaxhighlight lang="java">
package exceptions;
import java.io.IOException;
class FileFormatException extends IOException
{
public FileFormatException () {} // конструктор по замовчуванню
public FileFormatException(String gripe) // конструктор, що забезпечує повернення зазначеного повідомлення
{
super(gripe);
}
}
</syntaxhighlight>
Тепер в коді, що повинен породжувати виняток можна вставити викидання даного винятку:<code>throw new FileFormatException(); </code>.
<syntaxhighlight lang="java">
package exceptions;
public class TestNewException {
public static void main(String[] args) {
try {
throw new FileFormatException("Не той формат файлу");
} catch (Exception e) {
System.out.println("Повідомлення винятку: "+e.getMessage());
}
}
}
</syntaxhighlight>
Результат:
<pre>
Повідомлення винятку: Не той формат файлу
</pre>
==Додаткові джерела==
* [http://docs.oracle.com/javase/tutorial/essential/exceptions/index.html Урок: Винятки // Java посібники на сайті Oracle (англ)]
==Примітки==
<references/>
(даний розділ незавершений, потребує доповнення. Необхідно дописати: отримання інформації про винятки, зчеплення винятків, створення власних)
[[Категорія:Освоюємо Java]]
{{Гортання сторінок|Об'єкти і класи|Графічний інтерфейс користувача}}
mt10d2359579mw0uyixz180wscpa2rh
36909
36908
2022-08-06T19:51:25Z
Володимир Груша
985
/* Throw */
wikitext
text/x-wiki
'''Виняткова ситуація''' або просто '''виняток''' (англ. exception) – це аварійний стан, який відбувається саме під час виконання програми. Прикладом є — ділення на нуль, помилки читання з файлу та мережі тощо. Іншими словами – це помилки які можуть виникнути при виконанні програми. В ряді мов програмування необхідно заздалегідь передбачити можливість тієї чи іншої помилки і передбачити шлях її обробки. В java для цього передбачений спеціальний механізм винятків.
==Винятки в java==
Виняток в java – це об'єкт, який описує виняткову (тобто, помилкову) ситуацію, що відбулась в певному місці коду. Коли така ситуація виникає створюється об'єкт, який передається («вкидається») в метод, в якому виникла помилка. Далі в методі даний виняток може оброблятися, або бути переданий ще кудись для обробки.
Розглянемо для прикладу наступну програму '''DivZero.java'''
<syntaxhighlight lang="java">
public class DivZero {
public static void main(String[] args) {
int my = 0;
int medium = 44 / my;
System.out.println("medium=" + medium);
}
}
</syntaxhighlight>
Як бачимо в програмі присутнє ділення на нуль. При компіляції ми не отримаємо помилок. Проте, після запуску програми, отримаємо наступне:
<pre>
Exception in thread "main" java.lang.ArithmeticException: / by zero
at DivZero.main(DivZero.java:4)
</pre>
Це так звана ''траса стеку викликів''. Перший рядок означає тип-винятку. Як бачимо тут маємо ArithmeticException з діленням на нуль. java.lang – це пакет класів, який завжди доступний в програмі і який містить найбільш використовувані класи. Тобто його не потрібно імпортувати. Другий рядок вказує де саме відбулась виняткова ситуація: 4-й рядок у файлі DivZero.java в методі main() класу DivZero. При цьому як бачимо програма завершила своє виконання аварійно. Для уникнення цього існує відповідний механізм обробки винятків, який дозволяє перехопити виняток, одержати інформацію про нього, обробити його здійснивши певні дії для нормального закінчення або продовження виконання програми.
==Типи винятків==
Усі типи винятків є підкласами класу '''Throwable''', який входить в базовий пакет класів Java - java.lang. Тобто він є вершиною ієрархії класів винятків. Його два підкласи '''Error''' та '''Exception''' утворюють дві основні гілки винятків.
Клас Error з його підкласами - це помилки виконавчого середовища java. І які зазвичай не виникають при нормальній роботі середовища java. Такі винятки зазвичай не можуть бути оброблені в програмі.
Гілка класу Exception - це винятки, які програма повинна вловлювати(catch). Від даного класу та його підкласів можна утворювати власні підкласи. Важливим його підкласом є клас '''RuntimeException'''. Винятки даного типу включають такі винятки як ділення на нуль та помилкова індексація масивів.
Актуальну ієрархію класів винятків можна подивитися і уточнити в офіційній документації до JDK<ref>[http://docs.oracle.com/javase/7/docs/api/index.html Java™ Platform, Standard Edition 7 API Specification (Натисніть TREE для перегляду ієрархії класів)]</ref>.
==Конструкція try==
Для обробки виняткових ситуацій використовується п’ять ключових слів: try, catch, throw, throws та finally.
Інструкції програми, в яких може виникнути помилка, контролюються за допомогою конструкції try.
Загальна форма наступна:
<pre>
try{
//блок коду для контролю над помилками
} catch (тип-винятку1 об’єкт-винятку) {
//дії при виникненні типу винятку1 (обробник винятку)
} catch (тип-винятку2 об’єкт-винятку) {
//дії при виникненні типу винятку2 (обробник винятку)
}
//….
[finally{
//дії при виході з конструкції try.
}]
</pre>
Після інструкції try ми розміщуємо «небезпечний» код, у блоці catch відбувається обробка винятку, причому може бути кілька інструкцій catch. При використанні кількох інструкцій catch необхідно зважати на ієрархію класів винятків. Класи нащадки повинні оброблятися раніше за батьківські класи. Інакше обробка конкретного винятку просто буде неможлива, оскільки першим буде викликаний catch з батьківським класом (див. поліморфізм) і до нащадків діло не дійде. Завершувати конструкцію може інструкція finally, в ній розміщується код, який буде виконаний після обробки винятку в інструкції catch.
Починаючи з java 7 стало можливим обробити два різнотипні винятки в одному блоці catch:
<pre>
catch (FileNotFoundException | UnknownHostException е) {
// дії при обробці винятків
}
</pre>
Так слід робити, якщо винятки не є підкласами один для іншого.
Таким чином можемо переписати програму з діленням на нуль:
<syntaxhighlight lang=java>
public class DivZero {
public static void main(String args[]){
int my=0;
try{
int medium=44/my;
System.out.println("medium="+medium);
}catch(ArithmeticException e){
System.out.println("Ділення на нуль!");
}
System.out.println("Продовження виконання...");
}
}
</syntaxhighlight>
Результат виконання:
<pre>Ділення на нуль!
Продовження виконання...</pre>
Як бачимо, для перехоплення винятку, код, через який виникала помилка, знаходиться у середині конструкції try. Також, зверніть увагу, що після виникнення виняткової ситуації наступний рядок ''System.out.println("medium="+medium);'' не було виведено, оскільки виняток був переданий для обробки в catch. Після інструкції програми в якій відбулась виняткова ситуація, всі наступні рядки до інструкції catch пропускаються і не будуть виконуватись. І, як бачимо з результату виконання, наша програма продовжила виконання по закінченню блоку try, а не завершила своє виконання аварійно.
===try з ресурсами===
При використанні всередині try певних ресурсів, наприклад, файлів, при виникненні винятку необхідно було передбачити закриття відкритих ресурсів. Для цієї мети раніше приходилося використовувати блок finally. У Java 7 з'явилася конструкція try з ресурсами (англ. try-with-resources)<ref>[https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html The try-with-resources Statement]</ref>. Тепер просто можна створити ресурс у дужках зразу ж після ключового слова try і java сама потурбується про закриття ресурсу. Приклад:
<syntaxhighlight lang="java">
static String readFirstLineFromFile(String path) throws IOException {
try (BufferedReader br =
new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}</syntaxhighlight>
==Throw==
В наведених вище прикладах ми здійснювали лише обробку винятків викинутих виконавчим середовищем java. Проте існує можливість викидання власних винятків. Для цього існує інструкція Throw. Загальна форма її наступна:
<pre>
throw ThrowableInstance;
</pre>
Тут ThrowableInstance – це тип винятку, який повинен бути або типом Throwable, або мати тип його підкласів. Щоб програма викинула ваш виняток необхідно скористатися оператором new. Для того, щоб одержати(перехопити) тип винятку можна скористатися інструкцією catch, як це ми робили вище.
Після інструкції throw відбувається аналогічне породження винятку як у вище наведених прикладах. Тобто усі інструкції пропускаються до найближчого блоку інструкції catch, де необхідно здійснити обробку винятку. Якщо catch не буде знайдено, то обробник винятків, що використовується по замовчуванню, призупиняє виконання програми і друкує відбиток стеку (stack trace).
Приклад:
<syntaxhighlight lang="java">
package exceptions;
public class ThrowNullException {
public static void main(String args[]){
try{
throw new NullPointerException("Пробний виняток");
}catch(Exception e){
System.out.println("Наш витяток: "+e);
}
}
}
</syntaxhighlight>
Результат:
<pre>
Наш витяток: java.lang.NullPointerException: Пробний виняток
</pre>
Програма демонструє як створювати один із стандартних винятків. Більшість вбудованих run-time винятків Java мають щонайменше два конструктори. Один за замовчуванням без параметрів і один із параметром String, який дозволяє задати додатковий опис. Опис можна вивести на консоль за допомогою методів '''print(), println()'''. Також його можна отримати використавши метод '''getMessage()''' класу Throwable. Замість методу println() можна написати e.printStackTrace() і отримати послідовність стеку викликів. Так якщо б ми в наведеному виклику в catch використали e.printStackTrace(), то могли б отримати щось таке:
<pre>
java.lang.NullPointerException: Пробний виняток
at OsvJava/exceptions.ThrowNullException.main(ThrowNullException.java:6)
</pre>
Можна створити власний тип винятку як підклас уже існуючого типу.
==Throws==
Якщо метод породжує виняток і не обробляє його, то він повинен вказати про це, щоб обробка винятку була здійснена у місці виклику даного методу. Це здійснюється за допомогою застереження throws в оголошенні методу. Після нього вказується підряд через кому усі винятки, які можуть бути викинуті методом, окрім винятків класів Error та RuntimeException і їхніх підкласів. Нагадаємо, що клас Error – це необроблювані винятки, RuntimeException – винятки, які виникають в результаті помилки програміста (вихід за межі масиву, нульове посилання, невірне перетворення типів). Інші винятки – це помилки доступу, які доволі часто вимагають відповідної обробки.
Загальна форма оголошення методу наступна:
<pre>
тип ім’я_методу(список_параметрів) throws список_винятків
{
// тіло методу
}
</pre>
Наступна програма демонструє використання throws у методі де виникає виняток IllegalAccessException.
<syntaxhighlight lang="java">
public class ThrowsException {
public static void exceptionMethod () throws IllegalAccessException{
System.out.println("Всередині exceptionMethod().");
throw new IllegalAccessException("Помилка доступу");
}
public static void main(String args[]){
try{
exceptionMethod();
System.out.println("Кінець програми"); //даний рядок не буде виведений
}catch(IllegalAccessException e){
System.out.println("Наш витяток: "+e);
}
}
}
</syntaxhighlight>
Результат:
<pre>
Всередині ExceptionMethod().
Наш витяток: java.lang.IllegalAccessException: Помилка доступу
</pre>
Як бачимо тепер обробка винятку відбувається у методі main(). Без інструкції try-catch програма призупинятиметься з друком відбитку стеку. Слід зауважити, що у методах інструкція throw поводить себе подібно до інструкції return. Тобто виконання методу припиняється і відбувається повернення в місце виклику методу.
Інструкцію throws не можливо використати при заміщенні методу в класах нащадках, якщо метод батьківського класу не викидав виняток. Тож відповідний метод класу нащадку не викидатиме виняток.
==Створення власних винятків==
Якщо вам не підходить жоден з існуючих класів винятків, то можна створити власний. Він повинен розширювати клас Exception, або будь-який із похідних класів.
<syntaxhighlight lang="java">
package exceptions;
import java.io.IOException;
class FileFormatException extends IOException
{
public FileFormatException () {} // конструктор по замовчуванню
public FileFormatException(String gripe) // конструктор, що забезпечує повернення зазначеного повідомлення
{
super(gripe);
}
}
</syntaxhighlight>
Тепер в коді, що повинен породжувати виняток можна вставити викидання даного винятку:<code>throw new FileFormatException(); </code>.
<syntaxhighlight lang="java">
package exceptions;
public class TestNewException {
public static void main(String[] args) {
try {
throw new FileFormatException("Не той формат файлу");
} catch (Exception e) {
System.out.println("Повідомлення винятку: "+e.getMessage());
}
}
}
</syntaxhighlight>
Результат:
<pre>
Повідомлення винятку: Не той формат файлу
</pre>
==Додаткові джерела==
* [http://docs.oracle.com/javase/tutorial/essential/exceptions/index.html Урок: Винятки // Java посібники на сайті Oracle (англ)]
==Примітки==
<references/>
(даний розділ незавершений, потребує доповнення. Необхідно дописати: отримання інформації про винятки, зчеплення винятків, створення власних)
[[Категорія:Освоюємо Java]]
{{Гортання сторінок|Об'єкти і класи|Графічний інтерфейс користувача}}
5d291fe89xxbu2dpxprqcszoumvwzvs
36910
36909
2022-08-06T19:52:54Z
Володимир Груша
985
/* Throw */
wikitext
text/x-wiki
'''Виняткова ситуація''' або просто '''виняток''' (англ. exception) – це аварійний стан, який відбувається саме під час виконання програми. Прикладом є — ділення на нуль, помилки читання з файлу та мережі тощо. Іншими словами – це помилки які можуть виникнути при виконанні програми. В ряді мов програмування необхідно заздалегідь передбачити можливість тієї чи іншої помилки і передбачити шлях її обробки. В java для цього передбачений спеціальний механізм винятків.
==Винятки в java==
Виняток в java – це об'єкт, який описує виняткову (тобто, помилкову) ситуацію, що відбулась в певному місці коду. Коли така ситуація виникає створюється об'єкт, який передається («вкидається») в метод, в якому виникла помилка. Далі в методі даний виняток може оброблятися, або бути переданий ще кудись для обробки.
Розглянемо для прикладу наступну програму '''DivZero.java'''
<syntaxhighlight lang="java">
public class DivZero {
public static void main(String[] args) {
int my = 0;
int medium = 44 / my;
System.out.println("medium=" + medium);
}
}
</syntaxhighlight>
Як бачимо в програмі присутнє ділення на нуль. При компіляції ми не отримаємо помилок. Проте, після запуску програми, отримаємо наступне:
<pre>
Exception in thread "main" java.lang.ArithmeticException: / by zero
at DivZero.main(DivZero.java:4)
</pre>
Це так звана ''траса стеку викликів''. Перший рядок означає тип-винятку. Як бачимо тут маємо ArithmeticException з діленням на нуль. java.lang – це пакет класів, який завжди доступний в програмі і який містить найбільш використовувані класи. Тобто його не потрібно імпортувати. Другий рядок вказує де саме відбулась виняткова ситуація: 4-й рядок у файлі DivZero.java в методі main() класу DivZero. При цьому як бачимо програма завершила своє виконання аварійно. Для уникнення цього існує відповідний механізм обробки винятків, який дозволяє перехопити виняток, одержати інформацію про нього, обробити його здійснивши певні дії для нормального закінчення або продовження виконання програми.
==Типи винятків==
Усі типи винятків є підкласами класу '''Throwable''', який входить в базовий пакет класів Java - java.lang. Тобто він є вершиною ієрархії класів винятків. Його два підкласи '''Error''' та '''Exception''' утворюють дві основні гілки винятків.
Клас Error з його підкласами - це помилки виконавчого середовища java. І які зазвичай не виникають при нормальній роботі середовища java. Такі винятки зазвичай не можуть бути оброблені в програмі.
Гілка класу Exception - це винятки, які програма повинна вловлювати(catch). Від даного класу та його підкласів можна утворювати власні підкласи. Важливим його підкласом є клас '''RuntimeException'''. Винятки даного типу включають такі винятки як ділення на нуль та помилкова індексація масивів.
Актуальну ієрархію класів винятків можна подивитися і уточнити в офіційній документації до JDK<ref>[http://docs.oracle.com/javase/7/docs/api/index.html Java™ Platform, Standard Edition 7 API Specification (Натисніть TREE для перегляду ієрархії класів)]</ref>.
==Конструкція try==
Для обробки виняткових ситуацій використовується п’ять ключових слів: try, catch, throw, throws та finally.
Інструкції програми, в яких може виникнути помилка, контролюються за допомогою конструкції try.
Загальна форма наступна:
<pre>
try{
//блок коду для контролю над помилками
} catch (тип-винятку1 об’єкт-винятку) {
//дії при виникненні типу винятку1 (обробник винятку)
} catch (тип-винятку2 об’єкт-винятку) {
//дії при виникненні типу винятку2 (обробник винятку)
}
//….
[finally{
//дії при виході з конструкції try.
}]
</pre>
Після інструкції try ми розміщуємо «небезпечний» код, у блоці catch відбувається обробка винятку, причому може бути кілька інструкцій catch. При використанні кількох інструкцій catch необхідно зважати на ієрархію класів винятків. Класи нащадки повинні оброблятися раніше за батьківські класи. Інакше обробка конкретного винятку просто буде неможлива, оскільки першим буде викликаний catch з батьківським класом (див. поліморфізм) і до нащадків діло не дійде. Завершувати конструкцію може інструкція finally, в ній розміщується код, який буде виконаний після обробки винятку в інструкції catch.
Починаючи з java 7 стало можливим обробити два різнотипні винятки в одному блоці catch:
<pre>
catch (FileNotFoundException | UnknownHostException е) {
// дії при обробці винятків
}
</pre>
Так слід робити, якщо винятки не є підкласами один для іншого.
Таким чином можемо переписати програму з діленням на нуль:
<syntaxhighlight lang=java>
public class DivZero {
public static void main(String args[]){
int my=0;
try{
int medium=44/my;
System.out.println("medium="+medium);
}catch(ArithmeticException e){
System.out.println("Ділення на нуль!");
}
System.out.println("Продовження виконання...");
}
}
</syntaxhighlight>
Результат виконання:
<pre>Ділення на нуль!
Продовження виконання...</pre>
Як бачимо, для перехоплення винятку, код, через який виникала помилка, знаходиться у середині конструкції try. Також, зверніть увагу, що після виникнення виняткової ситуації наступний рядок ''System.out.println("medium="+medium);'' не було виведено, оскільки виняток був переданий для обробки в catch. Після інструкції програми в якій відбулась виняткова ситуація, всі наступні рядки до інструкції catch пропускаються і не будуть виконуватись. І, як бачимо з результату виконання, наша програма продовжила виконання по закінченню блоку try, а не завершила своє виконання аварійно.
===try з ресурсами===
При використанні всередині try певних ресурсів, наприклад, файлів, при виникненні винятку необхідно було передбачити закриття відкритих ресурсів. Для цієї мети раніше приходилося використовувати блок finally. У Java 7 з'явилася конструкція try з ресурсами (англ. try-with-resources)<ref>[https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html The try-with-resources Statement]</ref>. Тепер просто можна створити ресурс у дужках зразу ж після ключового слова try і java сама потурбується про закриття ресурсу. Приклад:
<syntaxhighlight lang="java">
static String readFirstLineFromFile(String path) throws IOException {
try (BufferedReader br =
new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}</syntaxhighlight>
==Throw==
В наведених вище прикладах ми здійснювали лише обробку винятків викинутих виконавчим середовищем java. Проте існує можливість викидання власних винятків. Для цього існує інструкція Throw. Загальна форма її наступна:
<pre>
throw ThrowableInstance;
</pre>
Тут ThrowableInstance – це тип винятку, який повинен бути або типом Throwable, або мати тип його підкласів. Щоб програма викинула ваш виняток необхідно скористатися оператором new. Для того, щоб одержати(перехопити) тип винятку можна скористатися інструкцією catch, як це ми робили вище.
Після інструкції throw відбувається аналогічне породження винятку як у вище наведених прикладах. Тобто усі інструкції пропускаються до найближчого блоку інструкції catch, де необхідно здійснити обробку винятку. Якщо catch не буде знайдено, то обробник винятків, що використовується по замовчуванню, призупиняє виконання програми і друкує відбиток стеку (stack trace).
Приклад:
<syntaxhighlight lang="java">
package exceptions;
public class ThrowNullException {
public static void main(String args[]){
try{
throw new NullPointerException("Пробний виняток");
}catch(Exception e){
System.out.println("Наш витяток: "+e);
}
}
}
</syntaxhighlight>
Результат:
<pre>
Наш витяток: java.lang.NullPointerException: Пробний виняток
</pre>
Програма демонструє як створювати один із стандартних винятків. Більшість вбудованих run-time винятків Java мають щонайменше два конструктори. Один за замовчуванням без параметрів і один із параметром String, який дозволяє задати додатковий опис. Опис можна вивести на консоль за допомогою методів '''print(), println()'''. Також його можна отримати використавши метод '''getMessage()''' класу Throwable. Замість методу println() можна написати e.printStackTrace() і отримати послідовність стеку викликів. Так якщо б ми в наведеному виклику в catch використали e.printStackTrace(), то могли б отримати щось таке:
<pre>
java.lang.NullPointerException: Пробний виняток
at exceptions.ThrowNullException.main(ThrowNullException.java:6)
</pre>
Можна створити власний тип винятку як підклас уже існуючого типу.
==Throws==
Якщо метод породжує виняток і не обробляє його, то він повинен вказати про це, щоб обробка винятку була здійснена у місці виклику даного методу. Це здійснюється за допомогою застереження throws в оголошенні методу. Після нього вказується підряд через кому усі винятки, які можуть бути викинуті методом, окрім винятків класів Error та RuntimeException і їхніх підкласів. Нагадаємо, що клас Error – це необроблювані винятки, RuntimeException – винятки, які виникають в результаті помилки програміста (вихід за межі масиву, нульове посилання, невірне перетворення типів). Інші винятки – це помилки доступу, які доволі часто вимагають відповідної обробки.
Загальна форма оголошення методу наступна:
<pre>
тип ім’я_методу(список_параметрів) throws список_винятків
{
// тіло методу
}
</pre>
Наступна програма демонструє використання throws у методі де виникає виняток IllegalAccessException.
<syntaxhighlight lang="java">
public class ThrowsException {
public static void exceptionMethod () throws IllegalAccessException{
System.out.println("Всередині exceptionMethod().");
throw new IllegalAccessException("Помилка доступу");
}
public static void main(String args[]){
try{
exceptionMethod();
System.out.println("Кінець програми"); //даний рядок не буде виведений
}catch(IllegalAccessException e){
System.out.println("Наш витяток: "+e);
}
}
}
</syntaxhighlight>
Результат:
<pre>
Всередині ExceptionMethod().
Наш витяток: java.lang.IllegalAccessException: Помилка доступу
</pre>
Як бачимо тепер обробка винятку відбувається у методі main(). Без інструкції try-catch програма призупинятиметься з друком відбитку стеку. Слід зауважити, що у методах інструкція throw поводить себе подібно до інструкції return. Тобто виконання методу припиняється і відбувається повернення в місце виклику методу.
Інструкцію throws не можливо використати при заміщенні методу в класах нащадках, якщо метод батьківського класу не викидав виняток. Тож відповідний метод класу нащадку не викидатиме виняток.
==Створення власних винятків==
Якщо вам не підходить жоден з існуючих класів винятків, то можна створити власний. Він повинен розширювати клас Exception, або будь-який із похідних класів.
<syntaxhighlight lang="java">
package exceptions;
import java.io.IOException;
class FileFormatException extends IOException
{
public FileFormatException () {} // конструктор по замовчуванню
public FileFormatException(String gripe) // конструктор, що забезпечує повернення зазначеного повідомлення
{
super(gripe);
}
}
</syntaxhighlight>
Тепер в коді, що повинен породжувати виняток можна вставити викидання даного винятку:<code>throw new FileFormatException(); </code>.
<syntaxhighlight lang="java">
package exceptions;
public class TestNewException {
public static void main(String[] args) {
try {
throw new FileFormatException("Не той формат файлу");
} catch (Exception e) {
System.out.println("Повідомлення винятку: "+e.getMessage());
}
}
}
</syntaxhighlight>
Результат:
<pre>
Повідомлення винятку: Не той формат файлу
</pre>
==Додаткові джерела==
* [http://docs.oracle.com/javase/tutorial/essential/exceptions/index.html Урок: Винятки // Java посібники на сайті Oracle (англ)]
==Примітки==
<references/>
(даний розділ незавершений, потребує доповнення. Необхідно дописати: отримання інформації про винятки, зчеплення винятків, створення власних)
[[Категорія:Освоюємо Java]]
{{Гортання сторінок|Об'єкти і класи|Графічний інтерфейс користувача}}
6eia0qutzdd7vtze2yh1sjazwv2pndu
36911
36910
2022-08-06T19:53:14Z
Володимир Груша
985
/* Throw */
wikitext
text/x-wiki
'''Виняткова ситуація''' або просто '''виняток''' (англ. exception) – це аварійний стан, який відбувається саме під час виконання програми. Прикладом є — ділення на нуль, помилки читання з файлу та мережі тощо. Іншими словами – це помилки які можуть виникнути при виконанні програми. В ряді мов програмування необхідно заздалегідь передбачити можливість тієї чи іншої помилки і передбачити шлях її обробки. В java для цього передбачений спеціальний механізм винятків.
==Винятки в java==
Виняток в java – це об'єкт, який описує виняткову (тобто, помилкову) ситуацію, що відбулась в певному місці коду. Коли така ситуація виникає створюється об'єкт, який передається («вкидається») в метод, в якому виникла помилка. Далі в методі даний виняток може оброблятися, або бути переданий ще кудись для обробки.
Розглянемо для прикладу наступну програму '''DivZero.java'''
<syntaxhighlight lang="java">
public class DivZero {
public static void main(String[] args) {
int my = 0;
int medium = 44 / my;
System.out.println("medium=" + medium);
}
}
</syntaxhighlight>
Як бачимо в програмі присутнє ділення на нуль. При компіляції ми не отримаємо помилок. Проте, після запуску програми, отримаємо наступне:
<pre>
Exception in thread "main" java.lang.ArithmeticException: / by zero
at DivZero.main(DivZero.java:4)
</pre>
Це так звана ''траса стеку викликів''. Перший рядок означає тип-винятку. Як бачимо тут маємо ArithmeticException з діленням на нуль. java.lang – це пакет класів, який завжди доступний в програмі і який містить найбільш використовувані класи. Тобто його не потрібно імпортувати. Другий рядок вказує де саме відбулась виняткова ситуація: 4-й рядок у файлі DivZero.java в методі main() класу DivZero. При цьому як бачимо програма завершила своє виконання аварійно. Для уникнення цього існує відповідний механізм обробки винятків, який дозволяє перехопити виняток, одержати інформацію про нього, обробити його здійснивши певні дії для нормального закінчення або продовження виконання програми.
==Типи винятків==
Усі типи винятків є підкласами класу '''Throwable''', який входить в базовий пакет класів Java - java.lang. Тобто він є вершиною ієрархії класів винятків. Його два підкласи '''Error''' та '''Exception''' утворюють дві основні гілки винятків.
Клас Error з його підкласами - це помилки виконавчого середовища java. І які зазвичай не виникають при нормальній роботі середовища java. Такі винятки зазвичай не можуть бути оброблені в програмі.
Гілка класу Exception - це винятки, які програма повинна вловлювати(catch). Від даного класу та його підкласів можна утворювати власні підкласи. Важливим його підкласом є клас '''RuntimeException'''. Винятки даного типу включають такі винятки як ділення на нуль та помилкова індексація масивів.
Актуальну ієрархію класів винятків можна подивитися і уточнити в офіційній документації до JDK<ref>[http://docs.oracle.com/javase/7/docs/api/index.html Java™ Platform, Standard Edition 7 API Specification (Натисніть TREE для перегляду ієрархії класів)]</ref>.
==Конструкція try==
Для обробки виняткових ситуацій використовується п’ять ключових слів: try, catch, throw, throws та finally.
Інструкції програми, в яких може виникнути помилка, контролюються за допомогою конструкції try.
Загальна форма наступна:
<pre>
try{
//блок коду для контролю над помилками
} catch (тип-винятку1 об’єкт-винятку) {
//дії при виникненні типу винятку1 (обробник винятку)
} catch (тип-винятку2 об’єкт-винятку) {
//дії при виникненні типу винятку2 (обробник винятку)
}
//….
[finally{
//дії при виході з конструкції try.
}]
</pre>
Після інструкції try ми розміщуємо «небезпечний» код, у блоці catch відбувається обробка винятку, причому може бути кілька інструкцій catch. При використанні кількох інструкцій catch необхідно зважати на ієрархію класів винятків. Класи нащадки повинні оброблятися раніше за батьківські класи. Інакше обробка конкретного винятку просто буде неможлива, оскільки першим буде викликаний catch з батьківським класом (див. поліморфізм) і до нащадків діло не дійде. Завершувати конструкцію може інструкція finally, в ній розміщується код, який буде виконаний після обробки винятку в інструкції catch.
Починаючи з java 7 стало можливим обробити два різнотипні винятки в одному блоці catch:
<pre>
catch (FileNotFoundException | UnknownHostException е) {
// дії при обробці винятків
}
</pre>
Так слід робити, якщо винятки не є підкласами один для іншого.
Таким чином можемо переписати програму з діленням на нуль:
<syntaxhighlight lang=java>
public class DivZero {
public static void main(String args[]){
int my=0;
try{
int medium=44/my;
System.out.println("medium="+medium);
}catch(ArithmeticException e){
System.out.println("Ділення на нуль!");
}
System.out.println("Продовження виконання...");
}
}
</syntaxhighlight>
Результат виконання:
<pre>Ділення на нуль!
Продовження виконання...</pre>
Як бачимо, для перехоплення винятку, код, через який виникала помилка, знаходиться у середині конструкції try. Також, зверніть увагу, що після виникнення виняткової ситуації наступний рядок ''System.out.println("medium="+medium);'' не було виведено, оскільки виняток був переданий для обробки в catch. Після інструкції програми в якій відбулась виняткова ситуація, всі наступні рядки до інструкції catch пропускаються і не будуть виконуватись. І, як бачимо з результату виконання, наша програма продовжила виконання по закінченню блоку try, а не завершила своє виконання аварійно.
===try з ресурсами===
При використанні всередині try певних ресурсів, наприклад, файлів, при виникненні винятку необхідно було передбачити закриття відкритих ресурсів. Для цієї мети раніше приходилося використовувати блок finally. У Java 7 з'явилася конструкція try з ресурсами (англ. try-with-resources)<ref>[https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html The try-with-resources Statement]</ref>. Тепер просто можна створити ресурс у дужках зразу ж після ключового слова try і java сама потурбується про закриття ресурсу. Приклад:
<syntaxhighlight lang="java">
static String readFirstLineFromFile(String path) throws IOException {
try (BufferedReader br =
new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}</syntaxhighlight>
==Throw==
В наведених вище прикладах ми здійснювали лише обробку винятків викинутих виконавчим середовищем java. Проте існує можливість викидання власних винятків. Для цього існує інструкція Throw. Загальна форма її наступна:
<pre>
throw ThrowableInstance;
</pre>
Тут ThrowableInstance – це тип винятку, який повинен бути або типом Throwable, або мати тип його підкласів. Щоб програма викинула ваш виняток необхідно скористатися оператором new. Для того, щоб одержати(перехопити) тип винятку можна скористатися інструкцією catch, як це ми робили вище.
Після інструкції throw відбувається аналогічне породження винятку як у вище наведених прикладах. Тобто усі інструкції пропускаються до найближчого блоку інструкції catch, де необхідно здійснити обробку винятку. Якщо catch не буде знайдено, то обробник винятків, що використовується по замовчуванню, призупиняє виконання програми і друкує відбиток стеку (stack trace).
Приклад:
<syntaxhighlight lang="java">
package exceptions;
public class ThrowNullException {
public static void main(String args[]){
try{
throw new NullPointerException("Пробний виняток");
}catch(Exception e){
System.out.println("Наш витяток: "+e);
}
}
}
</syntaxhighlight>
Результат:
<pre>
Наш витяток: java.lang.NullPointerException: Пробний виняток
</pre>
Програма демонструє як створювати один із стандартних винятків. Більшість вбудованих run-time винятків Java мають щонайменше два конструктори. Один за замовчуванням без параметрів і один із параметром String, який дозволяє задати додатковий опис. Опис можна вивести на консоль за допомогою методів '''print(), println()'''. Також його можна отримати використавши метод '''getMessage()''' класу Throwable. Замість методу println() можна написати e.printStackTrace() і отримати послідовність стеку викликів. Так якщо б ми в наведеному виклику в catch використали '''e.printStackTrace()''', то могли б отримати щось таке:
<pre>
java.lang.NullPointerException: Пробний виняток
at exceptions.ThrowNullException.main(ThrowNullException.java:6)
</pre>
Можна створити власний тип винятку як підклас уже існуючого типу.
==Throws==
Якщо метод породжує виняток і не обробляє його, то він повинен вказати про це, щоб обробка винятку була здійснена у місці виклику даного методу. Це здійснюється за допомогою застереження throws в оголошенні методу. Після нього вказується підряд через кому усі винятки, які можуть бути викинуті методом, окрім винятків класів Error та RuntimeException і їхніх підкласів. Нагадаємо, що клас Error – це необроблювані винятки, RuntimeException – винятки, які виникають в результаті помилки програміста (вихід за межі масиву, нульове посилання, невірне перетворення типів). Інші винятки – це помилки доступу, які доволі часто вимагають відповідної обробки.
Загальна форма оголошення методу наступна:
<pre>
тип ім’я_методу(список_параметрів) throws список_винятків
{
// тіло методу
}
</pre>
Наступна програма демонструє використання throws у методі де виникає виняток IllegalAccessException.
<syntaxhighlight lang="java">
public class ThrowsException {
public static void exceptionMethod () throws IllegalAccessException{
System.out.println("Всередині exceptionMethod().");
throw new IllegalAccessException("Помилка доступу");
}
public static void main(String args[]){
try{
exceptionMethod();
System.out.println("Кінець програми"); //даний рядок не буде виведений
}catch(IllegalAccessException e){
System.out.println("Наш витяток: "+e);
}
}
}
</syntaxhighlight>
Результат:
<pre>
Всередині ExceptionMethod().
Наш витяток: java.lang.IllegalAccessException: Помилка доступу
</pre>
Як бачимо тепер обробка винятку відбувається у методі main(). Без інструкції try-catch програма призупинятиметься з друком відбитку стеку. Слід зауважити, що у методах інструкція throw поводить себе подібно до інструкції return. Тобто виконання методу припиняється і відбувається повернення в місце виклику методу.
Інструкцію throws не можливо використати при заміщенні методу в класах нащадках, якщо метод батьківського класу не викидав виняток. Тож відповідний метод класу нащадку не викидатиме виняток.
==Створення власних винятків==
Якщо вам не підходить жоден з існуючих класів винятків, то можна створити власний. Він повинен розширювати клас Exception, або будь-який із похідних класів.
<syntaxhighlight lang="java">
package exceptions;
import java.io.IOException;
class FileFormatException extends IOException
{
public FileFormatException () {} // конструктор по замовчуванню
public FileFormatException(String gripe) // конструктор, що забезпечує повернення зазначеного повідомлення
{
super(gripe);
}
}
</syntaxhighlight>
Тепер в коді, що повинен породжувати виняток можна вставити викидання даного винятку:<code>throw new FileFormatException(); </code>.
<syntaxhighlight lang="java">
package exceptions;
public class TestNewException {
public static void main(String[] args) {
try {
throw new FileFormatException("Не той формат файлу");
} catch (Exception e) {
System.out.println("Повідомлення винятку: "+e.getMessage());
}
}
}
</syntaxhighlight>
Результат:
<pre>
Повідомлення винятку: Не той формат файлу
</pre>
==Додаткові джерела==
* [http://docs.oracle.com/javase/tutorial/essential/exceptions/index.html Урок: Винятки // Java посібники на сайті Oracle (англ)]
==Примітки==
<references/>
(даний розділ незавершений, потребує доповнення. Необхідно дописати: отримання інформації про винятки, зчеплення винятків, створення власних)
[[Категорія:Освоюємо Java]]
{{Гортання сторінок|Об'єкти і класи|Графічний інтерфейс користувача}}
7s81ut0fvxuyn0313zg0zfu1lz2e18e
36912
36911
2022-08-06T19:56:45Z
Володимир Груша
985
/* Throw */
wikitext
text/x-wiki
'''Виняткова ситуація''' або просто '''виняток''' (англ. exception) – це аварійний стан, який відбувається саме під час виконання програми. Прикладом є — ділення на нуль, помилки читання з файлу та мережі тощо. Іншими словами – це помилки які можуть виникнути при виконанні програми. В ряді мов програмування необхідно заздалегідь передбачити можливість тієї чи іншої помилки і передбачити шлях її обробки. В java для цього передбачений спеціальний механізм винятків.
==Винятки в java==
Виняток в java – це об'єкт, який описує виняткову (тобто, помилкову) ситуацію, що відбулась в певному місці коду. Коли така ситуація виникає створюється об'єкт, який передається («вкидається») в метод, в якому виникла помилка. Далі в методі даний виняток може оброблятися, або бути переданий ще кудись для обробки.
Розглянемо для прикладу наступну програму '''DivZero.java'''
<syntaxhighlight lang="java">
public class DivZero {
public static void main(String[] args) {
int my = 0;
int medium = 44 / my;
System.out.println("medium=" + medium);
}
}
</syntaxhighlight>
Як бачимо в програмі присутнє ділення на нуль. При компіляції ми не отримаємо помилок. Проте, після запуску програми, отримаємо наступне:
<pre>
Exception in thread "main" java.lang.ArithmeticException: / by zero
at DivZero.main(DivZero.java:4)
</pre>
Це так звана ''траса стеку викликів''. Перший рядок означає тип-винятку. Як бачимо тут маємо ArithmeticException з діленням на нуль. java.lang – це пакет класів, який завжди доступний в програмі і який містить найбільш використовувані класи. Тобто його не потрібно імпортувати. Другий рядок вказує де саме відбулась виняткова ситуація: 4-й рядок у файлі DivZero.java в методі main() класу DivZero. При цьому як бачимо програма завершила своє виконання аварійно. Для уникнення цього існує відповідний механізм обробки винятків, який дозволяє перехопити виняток, одержати інформацію про нього, обробити його здійснивши певні дії для нормального закінчення або продовження виконання програми.
==Типи винятків==
Усі типи винятків є підкласами класу '''Throwable''', який входить в базовий пакет класів Java - java.lang. Тобто він є вершиною ієрархії класів винятків. Його два підкласи '''Error''' та '''Exception''' утворюють дві основні гілки винятків.
Клас Error з його підкласами - це помилки виконавчого середовища java. І які зазвичай не виникають при нормальній роботі середовища java. Такі винятки зазвичай не можуть бути оброблені в програмі.
Гілка класу Exception - це винятки, які програма повинна вловлювати(catch). Від даного класу та його підкласів можна утворювати власні підкласи. Важливим його підкласом є клас '''RuntimeException'''. Винятки даного типу включають такі винятки як ділення на нуль та помилкова індексація масивів.
Актуальну ієрархію класів винятків можна подивитися і уточнити в офіційній документації до JDK<ref>[http://docs.oracle.com/javase/7/docs/api/index.html Java™ Platform, Standard Edition 7 API Specification (Натисніть TREE для перегляду ієрархії класів)]</ref>.
==Конструкція try==
Для обробки виняткових ситуацій використовується п’ять ключових слів: try, catch, throw, throws та finally.
Інструкції програми, в яких може виникнути помилка, контролюються за допомогою конструкції try.
Загальна форма наступна:
<pre>
try{
//блок коду для контролю над помилками
} catch (тип-винятку1 об’єкт-винятку) {
//дії при виникненні типу винятку1 (обробник винятку)
} catch (тип-винятку2 об’єкт-винятку) {
//дії при виникненні типу винятку2 (обробник винятку)
}
//….
[finally{
//дії при виході з конструкції try.
}]
</pre>
Після інструкції try ми розміщуємо «небезпечний» код, у блоці catch відбувається обробка винятку, причому може бути кілька інструкцій catch. При використанні кількох інструкцій catch необхідно зважати на ієрархію класів винятків. Класи нащадки повинні оброблятися раніше за батьківські класи. Інакше обробка конкретного винятку просто буде неможлива, оскільки першим буде викликаний catch з батьківським класом (див. поліморфізм) і до нащадків діло не дійде. Завершувати конструкцію може інструкція finally, в ній розміщується код, який буде виконаний після обробки винятку в інструкції catch.
Починаючи з java 7 стало можливим обробити два різнотипні винятки в одному блоці catch:
<pre>
catch (FileNotFoundException | UnknownHostException е) {
// дії при обробці винятків
}
</pre>
Так слід робити, якщо винятки не є підкласами один для іншого.
Таким чином можемо переписати програму з діленням на нуль:
<syntaxhighlight lang=java>
public class DivZero {
public static void main(String args[]){
int my=0;
try{
int medium=44/my;
System.out.println("medium="+medium);
}catch(ArithmeticException e){
System.out.println("Ділення на нуль!");
}
System.out.println("Продовження виконання...");
}
}
</syntaxhighlight>
Результат виконання:
<pre>Ділення на нуль!
Продовження виконання...</pre>
Як бачимо, для перехоплення винятку, код, через який виникала помилка, знаходиться у середині конструкції try. Також, зверніть увагу, що після виникнення виняткової ситуації наступний рядок ''System.out.println("medium="+medium);'' не було виведено, оскільки виняток був переданий для обробки в catch. Після інструкції програми в якій відбулась виняткова ситуація, всі наступні рядки до інструкції catch пропускаються і не будуть виконуватись. І, як бачимо з результату виконання, наша програма продовжила виконання по закінченню блоку try, а не завершила своє виконання аварійно.
===try з ресурсами===
При використанні всередині try певних ресурсів, наприклад, файлів, при виникненні винятку необхідно було передбачити закриття відкритих ресурсів. Для цієї мети раніше приходилося використовувати блок finally. У Java 7 з'явилася конструкція try з ресурсами (англ. try-with-resources)<ref>[https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html The try-with-resources Statement]</ref>. Тепер просто можна створити ресурс у дужках зразу ж після ключового слова try і java сама потурбується про закриття ресурсу. Приклад:
<syntaxhighlight lang="java">
static String readFirstLineFromFile(String path) throws IOException {
try (BufferedReader br =
new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}</syntaxhighlight>
==Throw==
В наведених вище прикладах ми здійснювали лише обробку винятків викинутих виконавчим середовищем java. Проте існує можливість викидання власних винятків. Для цього існує інструкція Throw. Загальна форма її наступна:
<pre>
throw ThrowableInstance;
</pre>
Тут ThrowableInstance – це тип винятку, який повинен бути або типом Throwable, або мати тип його підкласів. Щоб програма викинула ваш виняток необхідно скористатися оператором new. Для того, щоб одержати(перехопити) тип винятку можна скористатися інструкцією catch, як це ми робили вище.
Після інструкції throw відбувається аналогічне породження винятку як у вище наведених прикладах. Тобто усі інструкції пропускаються до найближчого блоку інструкції catch, де необхідно здійснити обробку винятку. Якщо catch не буде знайдено, то обробник винятків, що використовується по замовчуванню, призупиняє виконання програми і друкує відбиток стеку (stack trace).
Приклад:
<syntaxhighlight lang="java">
package exceptions;
public class ThrowNullException {
public static void main(String args[]){
try{
throw new NullPointerException("Пробний виняток");
}catch(Exception e){
System.out.println("Наш витяток: "+e);
}
}
}
</syntaxhighlight>
Результат:
<pre>
Наш витяток: java.lang.NullPointerException: Пробний виняток
</pre>
Програма демонструє як створювати один із стандартних винятків. Більшість вбудованих run-time винятків Java мають щонайменше два конструктори. Один за замовчуванням без параметрів і один із параметром String, який дозволяє задати додатковий опис. Опис можна вивести на консоль за допомогою методів '''print(), println()'''. Також його можна отримати використавши метод '''getMessage()''' класу Throwable. Замість методу println() можна написати e.printStackTrace() і отримати відбиток стеку. Так якщо б ми в наведеному виклику в catch використали '''e.printStackTrace()''', то могли б отримати щось таке:
<pre>
java.lang.NullPointerException: Пробний виняток
at exceptions.ThrowNullException.main(ThrowNullException.java:6)
</pre>
Можна створити власний тип винятку як підклас уже існуючого типу.
==Throws==
Якщо метод породжує виняток і не обробляє його, то він повинен вказати про це, щоб обробка винятку була здійснена у місці виклику даного методу. Це здійснюється за допомогою застереження throws в оголошенні методу. Після нього вказується підряд через кому усі винятки, які можуть бути викинуті методом, окрім винятків класів Error та RuntimeException і їхніх підкласів. Нагадаємо, що клас Error – це необроблювані винятки, RuntimeException – винятки, які виникають в результаті помилки програміста (вихід за межі масиву, нульове посилання, невірне перетворення типів). Інші винятки – це помилки доступу, які доволі часто вимагають відповідної обробки.
Загальна форма оголошення методу наступна:
<pre>
тип ім’я_методу(список_параметрів) throws список_винятків
{
// тіло методу
}
</pre>
Наступна програма демонструє використання throws у методі де виникає виняток IllegalAccessException.
<syntaxhighlight lang="java">
public class ThrowsException {
public static void exceptionMethod () throws IllegalAccessException{
System.out.println("Всередині exceptionMethod().");
throw new IllegalAccessException("Помилка доступу");
}
public static void main(String args[]){
try{
exceptionMethod();
System.out.println("Кінець програми"); //даний рядок не буде виведений
}catch(IllegalAccessException e){
System.out.println("Наш витяток: "+e);
}
}
}
</syntaxhighlight>
Результат:
<pre>
Всередині ExceptionMethod().
Наш витяток: java.lang.IllegalAccessException: Помилка доступу
</pre>
Як бачимо тепер обробка винятку відбувається у методі main(). Без інструкції try-catch програма призупинятиметься з друком відбитку стеку. Слід зауважити, що у методах інструкція throw поводить себе подібно до інструкції return. Тобто виконання методу припиняється і відбувається повернення в місце виклику методу.
Інструкцію throws не можливо використати при заміщенні методу в класах нащадках, якщо метод батьківського класу не викидав виняток. Тож відповідний метод класу нащадку не викидатиме виняток.
==Створення власних винятків==
Якщо вам не підходить жоден з існуючих класів винятків, то можна створити власний. Він повинен розширювати клас Exception, або будь-який із похідних класів.
<syntaxhighlight lang="java">
package exceptions;
import java.io.IOException;
class FileFormatException extends IOException
{
public FileFormatException () {} // конструктор по замовчуванню
public FileFormatException(String gripe) // конструктор, що забезпечує повернення зазначеного повідомлення
{
super(gripe);
}
}
</syntaxhighlight>
Тепер в коді, що повинен породжувати виняток можна вставити викидання даного винятку:<code>throw new FileFormatException(); </code>.
<syntaxhighlight lang="java">
package exceptions;
public class TestNewException {
public static void main(String[] args) {
try {
throw new FileFormatException("Не той формат файлу");
} catch (Exception e) {
System.out.println("Повідомлення винятку: "+e.getMessage());
}
}
}
</syntaxhighlight>
Результат:
<pre>
Повідомлення винятку: Не той формат файлу
</pre>
==Додаткові джерела==
* [http://docs.oracle.com/javase/tutorial/essential/exceptions/index.html Урок: Винятки // Java посібники на сайті Oracle (англ)]
==Примітки==
<references/>
(даний розділ незавершений, потребує доповнення. Необхідно дописати: отримання інформації про винятки, зчеплення винятків, створення власних)
[[Категорія:Освоюємо Java]]
{{Гортання сторінок|Об'єкти і класи|Графічний інтерфейс користувача}}
kq3w50brdiahm6wwon92s0qxuydpl0d
36913
36912
2022-08-06T19:58:16Z
Володимир Груша
985
/* Throws */
wikitext
text/x-wiki
'''Виняткова ситуація''' або просто '''виняток''' (англ. exception) – це аварійний стан, який відбувається саме під час виконання програми. Прикладом є — ділення на нуль, помилки читання з файлу та мережі тощо. Іншими словами – це помилки які можуть виникнути при виконанні програми. В ряді мов програмування необхідно заздалегідь передбачити можливість тієї чи іншої помилки і передбачити шлях її обробки. В java для цього передбачений спеціальний механізм винятків.
==Винятки в java==
Виняток в java – це об'єкт, який описує виняткову (тобто, помилкову) ситуацію, що відбулась в певному місці коду. Коли така ситуація виникає створюється об'єкт, який передається («вкидається») в метод, в якому виникла помилка. Далі в методі даний виняток може оброблятися, або бути переданий ще кудись для обробки.
Розглянемо для прикладу наступну програму '''DivZero.java'''
<syntaxhighlight lang="java">
public class DivZero {
public static void main(String[] args) {
int my = 0;
int medium = 44 / my;
System.out.println("medium=" + medium);
}
}
</syntaxhighlight>
Як бачимо в програмі присутнє ділення на нуль. При компіляції ми не отримаємо помилок. Проте, після запуску програми, отримаємо наступне:
<pre>
Exception in thread "main" java.lang.ArithmeticException: / by zero
at DivZero.main(DivZero.java:4)
</pre>
Це так звана ''траса стеку викликів''. Перший рядок означає тип-винятку. Як бачимо тут маємо ArithmeticException з діленням на нуль. java.lang – це пакет класів, який завжди доступний в програмі і який містить найбільш використовувані класи. Тобто його не потрібно імпортувати. Другий рядок вказує де саме відбулась виняткова ситуація: 4-й рядок у файлі DivZero.java в методі main() класу DivZero. При цьому як бачимо програма завершила своє виконання аварійно. Для уникнення цього існує відповідний механізм обробки винятків, який дозволяє перехопити виняток, одержати інформацію про нього, обробити його здійснивши певні дії для нормального закінчення або продовження виконання програми.
==Типи винятків==
Усі типи винятків є підкласами класу '''Throwable''', який входить в базовий пакет класів Java - java.lang. Тобто він є вершиною ієрархії класів винятків. Його два підкласи '''Error''' та '''Exception''' утворюють дві основні гілки винятків.
Клас Error з його підкласами - це помилки виконавчого середовища java. І які зазвичай не виникають при нормальній роботі середовища java. Такі винятки зазвичай не можуть бути оброблені в програмі.
Гілка класу Exception - це винятки, які програма повинна вловлювати(catch). Від даного класу та його підкласів можна утворювати власні підкласи. Важливим його підкласом є клас '''RuntimeException'''. Винятки даного типу включають такі винятки як ділення на нуль та помилкова індексація масивів.
Актуальну ієрархію класів винятків можна подивитися і уточнити в офіційній документації до JDK<ref>[http://docs.oracle.com/javase/7/docs/api/index.html Java™ Platform, Standard Edition 7 API Specification (Натисніть TREE для перегляду ієрархії класів)]</ref>.
==Конструкція try==
Для обробки виняткових ситуацій використовується п’ять ключових слів: try, catch, throw, throws та finally.
Інструкції програми, в яких може виникнути помилка, контролюються за допомогою конструкції try.
Загальна форма наступна:
<pre>
try{
//блок коду для контролю над помилками
} catch (тип-винятку1 об’єкт-винятку) {
//дії при виникненні типу винятку1 (обробник винятку)
} catch (тип-винятку2 об’єкт-винятку) {
//дії при виникненні типу винятку2 (обробник винятку)
}
//….
[finally{
//дії при виході з конструкції try.
}]
</pre>
Після інструкції try ми розміщуємо «небезпечний» код, у блоці catch відбувається обробка винятку, причому може бути кілька інструкцій catch. При використанні кількох інструкцій catch необхідно зважати на ієрархію класів винятків. Класи нащадки повинні оброблятися раніше за батьківські класи. Інакше обробка конкретного винятку просто буде неможлива, оскільки першим буде викликаний catch з батьківським класом (див. поліморфізм) і до нащадків діло не дійде. Завершувати конструкцію може інструкція finally, в ній розміщується код, який буде виконаний після обробки винятку в інструкції catch.
Починаючи з java 7 стало можливим обробити два різнотипні винятки в одному блоці catch:
<pre>
catch (FileNotFoundException | UnknownHostException е) {
// дії при обробці винятків
}
</pre>
Так слід робити, якщо винятки не є підкласами один для іншого.
Таким чином можемо переписати програму з діленням на нуль:
<syntaxhighlight lang=java>
public class DivZero {
public static void main(String args[]){
int my=0;
try{
int medium=44/my;
System.out.println("medium="+medium);
}catch(ArithmeticException e){
System.out.println("Ділення на нуль!");
}
System.out.println("Продовження виконання...");
}
}
</syntaxhighlight>
Результат виконання:
<pre>Ділення на нуль!
Продовження виконання...</pre>
Як бачимо, для перехоплення винятку, код, через який виникала помилка, знаходиться у середині конструкції try. Також, зверніть увагу, що після виникнення виняткової ситуації наступний рядок ''System.out.println("medium="+medium);'' не було виведено, оскільки виняток був переданий для обробки в catch. Після інструкції програми в якій відбулась виняткова ситуація, всі наступні рядки до інструкції catch пропускаються і не будуть виконуватись. І, як бачимо з результату виконання, наша програма продовжила виконання по закінченню блоку try, а не завершила своє виконання аварійно.
===try з ресурсами===
При використанні всередині try певних ресурсів, наприклад, файлів, при виникненні винятку необхідно було передбачити закриття відкритих ресурсів. Для цієї мети раніше приходилося використовувати блок finally. У Java 7 з'явилася конструкція try з ресурсами (англ. try-with-resources)<ref>[https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html The try-with-resources Statement]</ref>. Тепер просто можна створити ресурс у дужках зразу ж після ключового слова try і java сама потурбується про закриття ресурсу. Приклад:
<syntaxhighlight lang="java">
static String readFirstLineFromFile(String path) throws IOException {
try (BufferedReader br =
new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}</syntaxhighlight>
==Throw==
В наведених вище прикладах ми здійснювали лише обробку винятків викинутих виконавчим середовищем java. Проте існує можливість викидання власних винятків. Для цього існує інструкція Throw. Загальна форма її наступна:
<pre>
throw ThrowableInstance;
</pre>
Тут ThrowableInstance – це тип винятку, який повинен бути або типом Throwable, або мати тип його підкласів. Щоб програма викинула ваш виняток необхідно скористатися оператором new. Для того, щоб одержати(перехопити) тип винятку можна скористатися інструкцією catch, як це ми робили вище.
Після інструкції throw відбувається аналогічне породження винятку як у вище наведених прикладах. Тобто усі інструкції пропускаються до найближчого блоку інструкції catch, де необхідно здійснити обробку винятку. Якщо catch не буде знайдено, то обробник винятків, що використовується по замовчуванню, призупиняє виконання програми і друкує відбиток стеку (stack trace).
Приклад:
<syntaxhighlight lang="java">
package exceptions;
public class ThrowNullException {
public static void main(String args[]){
try{
throw new NullPointerException("Пробний виняток");
}catch(Exception e){
System.out.println("Наш витяток: "+e);
}
}
}
</syntaxhighlight>
Результат:
<pre>
Наш витяток: java.lang.NullPointerException: Пробний виняток
</pre>
Програма демонструє як створювати один із стандартних винятків. Більшість вбудованих run-time винятків Java мають щонайменше два конструктори. Один за замовчуванням без параметрів і один із параметром String, який дозволяє задати додатковий опис. Опис можна вивести на консоль за допомогою методів '''print(), println()'''. Також його можна отримати використавши метод '''getMessage()''' класу Throwable. Замість методу println() можна написати e.printStackTrace() і отримати відбиток стеку. Так якщо б ми в наведеному виклику в catch використали '''e.printStackTrace()''', то могли б отримати щось таке:
<pre>
java.lang.NullPointerException: Пробний виняток
at exceptions.ThrowNullException.main(ThrowNullException.java:6)
</pre>
Можна створити власний тип винятку як підклас уже існуючого типу.
==Throws==
Якщо метод породжує виняток і не обробляє його, то він повинен вказати про це, щоб обробка винятку була здійснена у місці виклику даного методу. Це здійснюється за допомогою застереження throws в оголошенні методу. Після нього вказується підряд через кому усі винятки, які можуть бути викинуті методом, окрім винятків класів Error та RuntimeException і їхніх підкласів. Нагадаємо, що клас Error – це необроблювані винятки, RuntimeException – винятки, які виникають в результаті помилки програміста (вихід за межі масиву, нульове посилання, невірне перетворення типів). Інші винятки – це помилки доступу, які доволі часто вимагають відповідної обробки.
Загальна форма оголошення методу наступна:
<pre>
тип ім’я_методу(список_параметрів) throws список_винятків
{
// тіло методу
}
</pre>
Наступна програма демонструє використання throws у методі де виникає виняток IllegalAccessException.
<syntaxhighlight lang="java">
public class ThrowsException {
public static void exceptionMethod () throws IllegalAccessException{
System.out.println("Всередині exceptionMethod().");
throw new IllegalAccessException("Помилка доступу");
}
public static void main(String args[]){
try{
exceptionMethod();
System.out.println("Кінець програми"); //даний рядок не буде виведений
}catch(IllegalAccessException e){
System.out.println("Наш витяток: "+e);
}
}
}
</syntaxhighlight>
Результат:
<pre>
Всередині ExceptionMethod().
Наш витяток: java.lang.IllegalAccessException: Помилка доступу
</pre>
Як бачимо тепер обробка винятку відбувається у методі main(). Без інструкції try-catch програма призупинятиметься з друком відбитку стеку. Слід зауважити, що у методах інструкція throw поводить себе подібно до інструкції return. Тобто виконання методу припиняється і відбувається повернення в місце виклику методу.
Інструкцію throws не можливо використати при заміщенні методу в класах нащадках, якщо аналогічний метод батьківського класу не викидав виняток.
==Створення власних винятків==
Якщо вам не підходить жоден з існуючих класів винятків, то можна створити власний. Він повинен розширювати клас Exception, або будь-який із похідних класів.
<syntaxhighlight lang="java">
package exceptions;
import java.io.IOException;
class FileFormatException extends IOException
{
public FileFormatException () {} // конструктор по замовчуванню
public FileFormatException(String gripe) // конструктор, що забезпечує повернення зазначеного повідомлення
{
super(gripe);
}
}
</syntaxhighlight>
Тепер в коді, що повинен породжувати виняток можна вставити викидання даного винятку:<code>throw new FileFormatException(); </code>.
<syntaxhighlight lang="java">
package exceptions;
public class TestNewException {
public static void main(String[] args) {
try {
throw new FileFormatException("Не той формат файлу");
} catch (Exception e) {
System.out.println("Повідомлення винятку: "+e.getMessage());
}
}
}
</syntaxhighlight>
Результат:
<pre>
Повідомлення винятку: Не той формат файлу
</pre>
==Додаткові джерела==
* [http://docs.oracle.com/javase/tutorial/essential/exceptions/index.html Урок: Винятки // Java посібники на сайті Oracle (англ)]
==Примітки==
<references/>
(даний розділ незавершений, потребує доповнення. Необхідно дописати: отримання інформації про винятки, зчеплення винятків, створення власних)
[[Категорія:Освоюємо Java]]
{{Гортання сторінок|Об'єкти і класи|Графічний інтерфейс користувача}}
7ijs92kd7u6ylm2yc1w0cmrnmrylzpx
Обговорення користувача:MdsShakil/header
3
7826
36896
2022-08-06T16:08:18Z
Pathoschild
384
create header for talk page ([[m:Synchbot|requested by MdsShakil]])
wikitext
text/x-wiki
<div style="display: flex; flex-wrap: wrap; justify-content: center; align-items: center; margin: 16px 0; border: 1px solid #aaaaaa;">
<div style="padding: 12px;">[[File:Circle-icons-megaphone.svg|75px|link=[[m:User_talk:MdsShakil]]]]</div>
<div style="flex: 1; padding: 12px; background-color: #dddddd; color: #555555;">
<div style="font-weight: bold; font-size: 150%; color: red; font-family: 'Comic Sans MS'">Welcome to my talk page!</div>
<div style="max-width: 700px">Hey! I am Shakil Hosen. I patrol many projects, and where I don't know the language I only act in cases of serious vandalism. If you think I have done anything wrong, feel free to [[m:User talk:MdsShakil|message me]] on Meta wiki. If you don't like that you can leave me messages here too, but since I do not watch all of my talk pages, your message might not get a timely response. Thanks! [[File:Face-smile.svg|18px|link=[[m:User:MdsShakil]]]]</div>
</div>
</div>
6ns6eellkw7iqc4yteyjnszfjmo2yio
Обговорення користувача:MdsShakil
3
7827
36897
2022-08-06T17:47:55Z
Pathoschild
384
add talk page header ([[m:Synchbot|requested by MdsShakil]])
wikitext
text/x-wiki
{{User talk:MdsShakil/header}}
tbo8m2n1p4y1shpmyu07h1k0g9pq65d