Я намагаюся дізнатися більше про основні Java та різні типи Throwables, чи може хтось повідомити мені про відмінності між винятками та помилками?
Я намагаюся дізнатися більше про основні Java та різні типи Throwables, чи може хтось повідомити мені про відмінності між винятками та помилками?
Відповіді:
Помилки не слід вловлювати чи поводити (за винятком рідкісних випадків). Виняток становлять хліб та вершкове масло. Javadoc пояснює це добре:
Помилка - це підклас Throwable, який вказує на серйозні проблеми, які розумна програма не повинна намагатися наздогнати. Більшість таких помилок - це ненормальні умови.
Подивіться на кілька підкласів Error
, взявши деякі їх коментарі JavaDoc:
AnnotationFormatError
- Викидається, коли аналізатор анотацій намагається прочитати примітку з файлу класу та визначить, що анотація неправильна.AssertionError
- Кинуто, щоб вказати, що твердження не вдалося.LinkageError
- підкласи LinkageError вказують на те, що клас має певну залежність від іншого класу; однак останній клас несумісно змінився після складання попереднього класу.VirtualMachineError
- Викинуто, щоб вказати, що віртуальна машина Java пошкоджена або не вистачає ресурсів, необхідних для її продовження роботи. Дійсно три важливі підкатегорії Throwable
:
Error
- Щось досить серйозне пішло не так, що більшість програм повинні вийти з ладу, а не намагатися вирішити проблему,RuntimeException
) - дуже часто помилка програмування, наприклад NullPointerException
аргумент або незаконний. Програми іноді можуть обробляти або відновлювати цю Throwable
категорію - або принаймні вловлювати її run()
методом теми , записувати скаргу та продовжувати працювати.FileNotFoundException
і TimeoutException
...Цей слайд із відображенням ієрархії виключень Java від @ georgios-gousios коротко пояснює відмінності між помилками та винятками в Java.
Помилки, як правило, сигналізують про закінчення вашої програми, коли ви це знаєте. Зазвичай його неможливо відновити і може призвести до виходу віртуального комп'ютера. Ловити їх не слід, за винятком можливого входу або відображення та відповідного повідомлення перед виходом.
Приклад: OutOfMemoryError - Не так багато ви можете зробити, оскільки ваша програма більше не може працювати.
Винятки часто підлягають відновленню і навіть тоді, коли їх немає, вони, як правило, означають, що спроба операції не вдалася, але ваша програма все одно може продовжуватись.
Приклад: IllegalArgumentException - передав недійсні дані методу, щоб виклик методу не вдався, але це не вплине на майбутні операції.
Це спрощені приклади, і є ще одне багатство інформації лише про виключення.
Помилки -
Error
s у java є типу java.lang.Error
.Error
s трапляються під час виконання. Вони не будуть відомі компілятору. Error
s здебільшого спричинене середовищем, в якому працює програма. java.lang.StackOverflowError
,java.lang.OutOfMemoryError
Винятки -
Exception
s у java є типу java.lang.Exception
.Exception
s включають як перевірений, так і неперевірений тип.try-catch
блоки.Exception
s в основному викликані самим додатком.SQLException
, IOException
ArrayIndexOutOfBoundException
, ClassCastException
,NullPointerException
подальше читання: http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/
НД робить це найкраще :
Помилка - це підклас Throwable, який вказує на серйозні проблеми, які розумна програма не повинна намагатися наздогнати.
Опис Error
класу досить зрозумілий:
Це
Error
підклас,Throwable
який вказує на серйозні проблеми, які розумне застосування не повинно намагатися наздогнати. Більшість таких помилок - це ненормальні умови.ThreadDeath
Помилка, хоча «нормальному» стані, також є підкласом ,Error
так як більшість додатків не повинні намагатися зловити його.Метод не вимагає оголошувати в пункті "кидок" будь-які підкласи,
Error
які можуть бути кинуті під час виконання методу, але не виявляються, оскільки ці помилки - це аномальні умови, які ніколи не повинні виникати.
Цитується з власної документаціїError
Java про клас .
Коротше кажучи, ви не повинні ловити Error
s, за винятком випадків, коли у вас є вагомі причини. (Наприклад, щоб запобігти збою вашого веб-сервера, якщо у сервлета не вистачає пам'яті або чогось подібного.)
З Exception
іншого боку, це просто нормальний виняток, як і в будь-якій іншій сучасній мові. Детальний опис ви знайдете в документації Java API або будь-якому ресурсі в Інтернеті чи в автономному режимі.
Існує кілька подібностей та відмінностей між класами java.lang.Exception
та java.lang.Error
.
Подібність:
По- перше - обидва класи поширюється java.lang.Throwable
і в результаті успадковує багато з методів , які є загальними для використання при роботі з помилками , такими як: getMessage
, getStackTrace
, printStackTrace
і так далі.
По-друге, як підкласи java.lang.Throwable
обох успадковують такі властивості:
Сама передача та будь-який її підклас (включаючи java.lang.Error
) можна оголосити у списку винятків методів за допомогою throws
ключового слова. Таку заяву потрібно тільки для java.lang.Exception
і підкласів, для java.lang.Throwable
, java.lang.Error
і java.lang.RuntimeException
та їх підкласів це НЕ є обов'язковим.
java.lang.Throwable
У catch
пункті дозволено використовувати лише підкласи та підкласи .
Тільки java.lang.Throwable
підкласи можуть використовуватися з ключовим словом - throw
.
Висновок з цього властивості слідує обом java.lang.Error
і java.lang.Exception
може бути оголошений у заголовку методу, може бути в catch
пункті, може використовуватися з ключовим словом throw
.
Відмінності:
По-перше - концептуальна різниця: java.lang.Error
розрахована на те, щоб кинути JVM і вказує на серйозні проблеми і призначена для зупинки виконання програми, а не для того, щоб бути спійманою (але це можливо, як для будь-якого іншого java.lang.Throwable
наступника).
Уривок з опису Явадока про java.lang.Error
:
... вказує на серйозні проблеми, які розумна програма не повинна намагатися наздогнати.
Навпаки, java.lang.Exception
призначені для відображення помилок, які очікуються та можуть бути вправлені програмістом без припинення виконання програми.
Уривок з опису Явадока про java.lang.Exception
:
... вказує на умови, які розумна програма може захопити.
java.lang.Error
і тим, java.lang.Exception
що вважається неперевіреним винятком для перевірки винятків під час компіляції. Оскільки викид коду результату java.lang.Error
або його підкласи не вимагають оголошувати цю помилку в заголовку методу. Під час закидання java.lang.Exception
необхідного оголошення у заголовок методу.Діаграмна схема та її наступний діаграма класів (властивості та методи опущені).
Помилка IMO - це те, що може призвести до відмови вашої програми, і не слід її обробляти. Виняток - це те, що може призвести до непередбачуваних результатів, але може бути відновлене.
Приклад:
Якщо в програмі не вистачає пам'яті, це помилка, оскільки програма не може продовжуватись. Однак якщо програма приймає неправильний тип введення, вона є винятком, оскільки програма може обробляти її та перенаправляти для отримання правильного типу введення.
Помилки в основному викликані середовищем, в якому працює програма. Наприклад, OutOfMemoryError виникає, коли у JVM не вистачає пам'яті або StackOverflowError виникає, коли стек переповнюється.
Винятки в основному спричиняються самим додатком. Наприклад, NullPointerException виникає, коли програма намагається отримати доступ до нульового об'єкта, або виникає ClassCastException, коли програма намагається видавати несумісні типи класів.
Ось досить хороший підсумок з Java API, що означає помилка та виняток:
Помилка - це підклас Throwable, який вказує на серйозні проблеми, які розумна програма не повинна намагатися наздогнати. Більшість таких помилок - це ненормальні умови. Помилка ThreadDeath, хоч і є "нормальною" умовою, також є підкласом помилки, оскільки більшість програм не повинні намагатися її зафіксувати.
Метод не зобов’язаний оголошувати в пункті кидок будь-які підкласи помилки, які можуть бути кинуті під час виконання методу, але не виявлені, оскільки ці помилки - це аномальні умови, які ніколи не повинні виникати.
OTOH, за винятками, API API Java говорить:
Виняток класу та його підкласи - це форма Throwable, яка вказує на умови, які розумне додаток може захотіти перехопити.
Помилки викликані середовищем, де працює ваша програма або програма. У більшості випадків ви не можете відновити його, оскільки це закінчує вашу програму чи програму. Javadoc радив, що ви не повинні турбуватись з тим, щоб ловити такі помилки, оскільки оточення, наприклад, JVM, на такі помилки все одно вийде.
Приклади:
VirtualMachineError
- кинуто для вказівки на те, що віртуальна машина Java зламана або не вистачає ресурсів, необхідних для продовження роботи.
OutOfMemoryError
виникає, коли у JVM закінчується пам'ять або
StackOverflowError
виникає, коли стек перебігає.
Винятки спричинені вашою програмою чи програмою; можливо через вашу власну помилку. У більшості випадків ви можете відновитись після цього, і ваша програма все ще буде працювати. Вам рекомендується робити такі помилки, щоб запобігти ненормальному припиненню вашої програми чи програми та / або мати можливість налаштувати повідомлення про виключення, щоб користувачі бачили добре відформатоване повідомлення замість негарних повідомлень про виключення за замовчуванням, розкиданих по всьому місцю.
Приклади:
NullPointerException
виникає, коли програма намагається отримати доступ до нульового об’єкта. або Спроба отримати доступ до масиву з неіснуючим індексом або викликати функцію з неправильними даними або параметрами.
Unchecked exceptions != RuntimeExceptions
;Unchecked exceptions = RuntimeExceptions + Errors
. Я знаю, що це викликає питання: чи помилка є винятком? , але це те, що вони пишуть. Ось лише один із таких прикладів: docs.oracle.com/javase/tutorial/essential/exceptions/… .