Виняток проти помилки
Неочікувана поведінка може виникнути під час запуску програми. Це може бути через винятки чи помилки. Виняток становлять події, які можуть порушити нормальний потік програми. Помилки - це умови, які можна вважати непоправними. Винятки здебільшого стосуються самого додатка, тоді як помилки пов'язані із системою, на якій працює програма.
Що таке виняток?
Виняток - подія, яка може порушити нормальний потік програми. Виняток із назви походить від "виняткової події". Закидання винятку - це процес створення об’єкта винятку та передачі його системі виконуваного. Об'єкт винятку створюється методом, у якому виняток відбувся. Об'єкт винятку містить корисну інформацію, таку як тип та опис винятку. Коли система виконання одержує об'єкт винятку, вона спробує знайти когось, щоб обробити його в стеці виклику, перемістивши його у зворотному порядку (у якому були названі методи). Стек викликів - це упорядкований список методів, які були викликані до того методу, у якому сталася виняток. Система виконання успішна, якщо вона знаходить метод із обробником винятків. Обробник винятків - це блок коду, який може офіційно обробляти зазначений виняток. Якщо система виконання знайде відповідний обробник (тобто тип винятку відповідає типу, який може бути оброблений), він передасть обробник об'єкта виключення. Це називається ловом винятку. Однак якщо виняток не вдається обробити, програма припиняється. У Java винятки успадковуються із класу "Throwable". NullPointerException та ArrayIndexOutOfBoundsException - два поширених винятки на Java.
Що таке помилка?
Помилка - це умова, яку можна вважати непоправною, наприклад, програма, яка вимагає обсягу пам'яті більше, ніж наявна. Ці помилки неможливо обробити під час виконання. Якщо виникла помилка, програма припиняється. У Java помилки успадковуються від класу Throwable. Помилки, як правило, є серйозними проблемами, які програміст (або додаток) не повинен намагатися наздогнати. Помилки - це просто ненормальні умови, які ніколи не очікуються у звичайних обставинах і тому ніколи не передбачаються. Наприклад, OutOfMemoryError, StackOverflowError та ThreadDead - це такі помилки. Методи ніколи не повинні мати обробників помилок.
Чим відрізняється виняток від помилки?
І помилки, і винятки є небажаним явищем під час виконання програми. Однак вони мають ключові відмінності. Винятки може передбачити програміст, тоді як помилку важко передбачити. Винятки можна перевірити або зняти з поля. Але помилки завжди не перевіряються. Винятки зазвичай вказують на помилку, викликану програмістом. Однак помилки трапляються через системну помилку або неналежне використання ресурсу. Тому винятки слід обробляти на рівні програми, тоді як помилки слід обережно на системному рівні (лише якщо це можливо). Після обробки винятку, ви гарантовано повернетесь до нормального потоку програми. Але навіть якщо помилка виявлена, програміст може не знати, як впоратися з нею в першу чергу. На відміну від традиційного поводження з помилками, винятки дозволяють відокремити код обробки помилок від звичайного коду.