Відмінності між виключенням та помилкою


173

Я намагаюся дізнатися більше про основні Java та різні типи Throwables, чи може хтось повідомити мені про відмінності між винятками та помилками?

Відповіді:


178

Помилки не слід вловлювати чи поводити (за винятком рідкісних випадків). Виняток становлять хліб та вершкове масло. Javadoc пояснює це добре:

Помилка - це підклас Throwable, який вказує на серйозні проблеми, які розумна програма не повинна намагатися наздогнати. Більшість таких помилок - це ненормальні умови.

Подивіться на кілька підкласів Error, взявши деякі їх коментарі JavaDoc:

  • AnnotationFormatError - Викидається, коли аналізатор анотацій намагається прочитати примітку з файлу класу та визначить, що анотація неправильна.
  • AssertionError - Кинуто, щоб вказати, що твердження не вдалося.
  • LinkageError- підкласи LinkageError вказують на те, що клас має певну залежність від іншого класу; однак останній клас несумісно змінився після складання попереднього класу.
  • VirtualMachineError - Викинуто, щоб вказати, що віртуальна машина Java пошкоджена або не вистачає ресурсів, необхідних для її продовження роботи.

Дійсно три важливі підкатегорії Throwable:

  • Error - Щось досить серйозне пішло не так, що більшість програм повинні вийти з ладу, а не намагатися вирішити проблему,
  • Неперевірене виняток (ака RuntimeException) - дуже часто помилка програмування, наприклад NullPointerExceptionаргумент або незаконний. Програми іноді можуть обробляти або відновлювати цю Throwableкатегорію - або принаймні вловлювати її run()методом теми , записувати скаргу та продовжувати працювати.
  • Перевірена виняток (інакше все інше) - Очікується, що програми зможуть спіймати та багатозначно зробити щось із іншими, такими як FileNotFoundExceptionі TimeoutException...

10
Oracle говорить про це Unchecked exceptions != RuntimeExceptions; Unchecked exceptions = RuntimeExceptions + Errors. Я знаю, що це викликає питання: чи помилка є винятком? , але це те, що вони пишуть. Ось лише один із таких прикладів: docs.oracle.com/javase/tutorial/essential/exceptions/… .
ROMANIA_engineer

1
Питання без відповіді полягає в тому, чим відрізняються RuntimeException та Помилка по суті? Обидва неперевірені та рівні в усіх інших спосіб.
Pacerier

38

Цей слайд із відображенням ієрархії виключень Java від @ georgios-gousios коротко пояснює відмінності між помилками та винятками в Java.

Ієрархія винятків Java


6
Мені б хотілося, щоб хтось одужав від NullPointerException: D: D: D
Ігнасіо Солер Гарсія

2
@IgnacioSolerGarcia Це може бути, і це навіть має сенс (інше питання, чи добре це). Зазвичай ви перевіряєте, чи існує об'єкт, і після цього викликаєте метод або використовуєте поле. Але ви можете замість того, щоб перевірити наявність, спробувати зловити NPE. І занотуйте повідомлення про це та продовжуйте, наприклад.
Gangnus

@Gangnus: немає сенсу. Пам'ятайте, що виняток пропускає частини коду і є способом повідомляти про помилки, а не про звичайні операції
Ignacio Soler Garcia

17

Помилки, як правило, сигналізують про закінчення вашої програми, коли ви це знаєте. Зазвичай його неможливо відновити і може призвести до виходу віртуального комп'ютера. Ловити їх не слід, за винятком можливого входу або відображення та відповідного повідомлення перед виходом.

Приклад: OutOfMemoryError - Не так багато ви можете зробити, оскільки ваша програма більше не може працювати.

Винятки часто підлягають відновленню і навіть тоді, коли їх немає, вони, як правило, означають, що спроба операції не вдалася, але ваша програма все одно може продовжуватись.

Приклад: IllegalArgumentException - передав недійсні дані методу, щоб виклик методу не вдався, але це не вплине на майбутні операції.

Це спрощені приклади, і є ще одне багатство інформації лише про виключення.


Подивіться приклади.javacodegeeks.com/ java-basics/ exceptions/… як приклад. IllegalArgumentException - це виключення під час виконання, а не помилка. docs.oracle.com/javase/7/docs/api/java/lang/…
Gangnus

8

Помилки -

  1. Errors у java є типу java.lang.Error.
  2. Усі помилки в Java неперевірені.
  3. Errors трапляються під час виконання. Вони не будуть відомі компілятору.
  4. Відмовитися від помилок неможливо.
  5. Errors здебільшого спричинене середовищем, в якому працює програма.
  6. Приклади: java.lang.StackOverflowError ,java.lang.OutOfMemoryError

Винятки -

  1. Exceptions у java є типу java.lang.Exception.
  2. Exceptions включають як перевірений, так і неперевірений тип.
  3. Перевірені винятки відомі компілятору, де як неперевірені винятки невідомі компілятору, оскільки вони трапляються під час виконання.
  4. Ви можете відновити винятки, обробляючи їх через try-catchблоки.
  5. Exceptions в основному викликані самим додатком.
  6. Приклади: Перевірили Виняток: SQLException, IOException
    Unchecked Виняток: ArrayIndexOutOfBoundException, ClassCastException,NullPointerException

подальше читання: http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/ http://javaconceptoftheday.com/wp-content/uploads/2015/04/ErrorVsException.png



3

Опис Errorкласу досить зрозумілий:

Це Errorпідклас, Throwable який вказує на серйозні проблеми, які розумне застосування не повинно намагатися наздогнати. Більшість таких помилок - це ненормальні умови. ThreadDeath Помилка, хоча «нормальному» стані, також є підкласом , Errorтак як більшість додатків не повинні намагатися зловити його.

Метод не вимагає оголошувати в пункті "кидок" будь-які підкласи, Errorякі можуть бути кинуті під час виконання методу, але не виявляються, оскільки ці помилки - це аномальні умови, які ніколи не повинні виникати.

Цитується з власної документаціїError Java про клас .

Коротше кажучи, ви не повинні ловити Errors, за винятком випадків, коли у вас є вагомі причини. (Наприклад, щоб запобігти збою вашого веб-сервера, якщо у сервлета не вистачає пам'яті або чогось подібного.)

З Exceptionіншого боку, це просто нормальний виняток, як і в будь-якій іншій сучасній мові. Детальний опис ви знайдете в документації Java API або будь-якому ресурсі в Інтернеті чи в автономному режимі.


2

Існує кілька подібностей та відмінностей між класами 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необхідного оголошення у заголовок методу.

Діаграмна схема та її наступний діаграма класів (властивості та методи опущені). введіть тут опис зображення


1

Помилка IMO - це те, що може призвести до відмови вашої програми, і не слід її обробляти. Виняток - це те, що може призвести до непередбачуваних результатів, але може бути відновлене.

Приклад:

Якщо в програмі не вистачає пам'яті, це помилка, оскільки програма не може продовжуватись. Однак якщо програма приймає неправильний тип введення, вона є винятком, оскільки програма може обробляти її та перенаправляти для отримання правильного типу введення.


1

Помилки в основному викликані середовищем, в якому працює програма. Наприклад, OutOfMemoryError виникає, коли у JVM не вистачає пам'яті або StackOverflowError виникає, коли стек переповнюється.

Винятки в основному спричиняються самим додатком. Наприклад, NullPointerException виникає, коли програма намагається отримати доступ до нульового об'єкта, або виникає ClassCastException, коли програма намагається видавати несумісні типи класів.

Джерело: Різниця між винятком помилок Vs у Java


"Помилки в основному викликані середовищем, в якому працює програма", а "Винятки в основному спричиняються самим додатком" ідеально!
ADJ

0

Ось досить хороший підсумок з Java API, що означає помилка та виняток:

Помилка - це підклас Throwable, який вказує на серйозні проблеми, які розумна програма не повинна намагатися наздогнати. Більшість таких помилок - це ненормальні умови. Помилка ThreadDeath, хоч і є "нормальною" умовою, також є підкласом помилки, оскільки більшість програм не повинні намагатися її зафіксувати.

Метод не зобов’язаний оголошувати в пункті кидок будь-які підкласи помилки, які можуть бути кинуті під час виконання методу, але не виявлені, оскільки ці помилки - це аномальні умови, які ніколи не повинні виникати.

OTOH, за винятками, API API Java говорить:

Виняток класу та його підкласи - це форма Throwable, яка вказує на умови, які розумне додаток може захотіти перехопити.


0

Помилки викликані середовищем, де працює ваша програма або програма. У більшості випадків ви не можете відновити його, оскільки це закінчує вашу програму чи програму. Javadoc радив, що ви не повинні турбуватись з тим, щоб ловити такі помилки, оскільки оточення, наприклад, JVM, на такі помилки все одно вийде.

Приклади: VirtualMachineError- кинуто для вказівки на те, що віртуальна машина Java зламана або не вистачає ресурсів, необхідних для продовження роботи. OutOfMemoryErrorвиникає, коли у JVM закінчується пам'ять або StackOverflowErrorвиникає, коли стек перебігає.

Винятки спричинені вашою програмою чи програмою; можливо через вашу власну помилку. У більшості випадків ви можете відновитись після цього, і ваша програма все ще буде працювати. Вам рекомендується робити такі помилки, щоб запобігти ненормальному припиненню вашої програми чи програми та / або мати можливість налаштувати повідомлення про виключення, щоб користувачі бачили добре відформатоване повідомлення замість негарних повідомлень про виключення за замовчуванням, розкиданих по всьому місцю.

Приклади: NullPointerExceptionвиникає, коли програма намагається отримати доступ до нульового об’єкта. або Спроба отримати доступ до масиву з неіснуючим індексом або викликати функцію з неправильними даними або параметрами.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.