Я намагаюся дізнатися більше про основні 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 - передав недійсні дані методу, щоб виклик методу не вдався, але це не вплине на майбутні операції.
Це спрощені приклади, і є ще одне багатство інформації лише про виключення.
Помилки -
Errors у java є типу java.lang.Error.Errors трапляються під час виконання. Вони не будуть відомі компілятору. Errors здебільшого спричинене середовищем, в якому працює програма. java.lang.StackOverflowError ,java.lang.OutOfMemoryErrorВинятки -
Exceptions у java є типу java.lang.Exception.Exceptions включають як перевірений, так і неперевірений тип.try-catchблоки.Exceptions в основному викликані самим додатком.SQLException, IOException ArrayIndexOutOfBoundException, ClassCastException,NullPointerExceptionподальше читання: http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/

НД робить це найкраще :
Помилка - це підклас Throwable, який вказує на серйозні проблеми, які розумна програма не повинна намагатися наздогнати.
Опис Errorкласу досить зрозумілий:
Це
Errorпідклас,Throwableякий вказує на серйозні проблеми, які розумне застосування не повинно намагатися наздогнати. Більшість таких помилок - це ненормальні умови.ThreadDeathПомилка, хоча «нормальному» стані, також є підкласом ,Errorтак як більшість додатків не повинні намагатися зловити його.Метод не вимагає оголошувати в пункті "кидок" будь-які підкласи,
Errorякі можуть бути кинуті під час виконання методу, але не виявляються, оскільки ці помилки - це аномальні умови, які ніколи не повинні виникати.
Цитується з власної документаціїError Java про клас .
Коротше кажучи, ви не повинні ловити Errors, за винятком випадків, коли у вас є вагомі причини. (Наприклад, щоб запобігти збою вашого веб-сервера, якщо у сервлета не вистачає пам'яті або чогось подібного.)
З 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/… .