Різниця між java.lang.RuntimeException та java.lang.Exception


210

Хтось, будь ласка, поясніть різницю між java.lang.RuntimeExceptionі java.lang.Exception? Як вирішити, який з них продовжити, якщо я створюю власний виняток?

Відповіді:


181

Як правило, RuntimeExceptions - це винятки, які можна запобігти програмно. Наприклад NullPointerException, ArrayIndexOutOfBoundException. Якщо ви звернетесь до цього, nullперш ніж викликати будь-який метод, NullPointerExceptionцього не відбудеться. Так само ArrayIndexOutOfBoundExceptionніколи не виникне, якщо ви спочатку перевірите індекс. RuntimeExceptionне перевіряються компілятором, тому це чистий код.

РЕДАКТУВАННЯ : Ці дні люди віддають перевагу RuntimeExceptionтому, що чистий код він створює. Це абсолютно особистий вибір.


10
Мені подобається, що цей кут "винятку з виконання часу міг би уникнути абонент". Це означає, що ви (як закликаючий метод) повинні переконатися, що вони навіть не відбудуться. Тоді як перевірені винятки - це те, чого ви не можете уникнути, і натомість вимагаєте розібратися з ними після факту. (І так, оскільки не всі погоджуються з концепцією перевірених винятків, і багато людей використовують RuntimeException для всього, це відмінність стало трохи заплутаним).
Тіло

4
В даний час люди віддають перевагу також неперевіреній RuntimeException, оскільки вона сумісна з обробкою Java 8 Lambda, тоді як перевірені винятки типу винятку не є.
Хартмут П.

2
Я підозрюю, що справжня причина, яку люди ловлять, RuntimeExceptionполягає в тому, що це просто і ухиляється від необхідності думати про відмінності між перевіреними та неперевіреними винятками. Я думаю, що вилучення винятків із виконання часу є жахливою ідеєю, оскільки ви зможете знайти непоодинокі винятки, такі як NullPointerException.
Dónal

186

У Java є два типи винятків: перевірені винятки та неперевірені винятки. Перевірений виняток повинен оброблятися явно кодом, тоді як неперевірений виняток не потрібно явно обробляти.

Для перевірених винятків вам або потрібно поставити блок try / catch навколо коду, який потенційно може викинути виняток, або додати до методу пункт "кидки", щоб вказати, що метод може викинути цей виняток (який повинен бути обробляється в класі дзвінків або вище).

Будь-який виняток, що походить від "Винятку", є перевіреним винятком, тоді як клас, який походить від RuntimeException, не перевіряється. RuntimeExceptions не потрібно чітко обробляти викликовим кодом.


3
Практично вірно, що "існують два типи винятків", але чому документація Oracle говорить, що існує три типи. Помилка розглядається як 3-й тип. Я думаю, що помилка взагалі не є винятком, а її просто перекидається (об'єкт), так, це імітує поведінку винятків під час виконання. Що б ви сказали про це? Oracle doc. реф. docs.oracle.com/javase/tutorial/essential/exceptions/…
Асиф Шахзад

3
Помилка не призначена для спіймання (хоча це може бути), як правило, ви використовуєте помилки для лову власних помилок під час роботи над новим кодом. Наприклад, якщо у вас є дерево, якщо if / elseif заява, остаточне інше може просто кинути помилку ("не очікував, що ця умова відбудеться") ;. Взагалі винятки мають випадки використання, коли вони ПОДАЄТЬСЯ статися, тоді як помилки не мають випадку використання, і вони є помилкою.
Денні

5
Але жарт RunTimeException сам поширює виняток: D (я знаю, що це не створює жодних проблем і JVM піклується про весь контекст)
Аліреза Мохамаді

94

Перш ніж подивитися на різницю між класами java.lang.RuntimeExceptionта java.lang.Exceptionкласами, ви повинні знати Exceptionієрархію. І класи, Exceptionі Errorкласи походять від класу Throwable(який походить від класу Object). І клас RuntimeExceptionпоходить від класу Exception.

Усі винятки походять від Exceptionабо RuntimeException.

Усі винятки, що випливають із цього RuntimeException, називаються неперевіреними винятками. А всі інші винятки - це перевірені винятки. Перевірений виняток повинен бути зафіксований десь у вашому коді, інакше він не складеться. Ось чому їх називають перевіреними винятками. З іншого боку, за неперевірених винятків, метод виклику не зобов'язаний обробляти чи оголошувати його.

Тому всі винятки, з яких компілятор змушує вас оброблятись, походять безпосередньо, java.lang.Exceptionа всі інші, з яких компілятор не змушує вас обробляти, походять із java.lang.RuntimeException.

Нижче наведено деякі з прямих відомих підкласів RuntimeException .

AnnotationTypeMismatchException,
ArithmeticException,
ArrayStoreException,
BufferOverflowException,
BufferUnderflowException,
CannotRedoException,
CannotUndoException,
ClassCastException,
CMMException,
ConcurrentModificationException,
DataBindingException,
DOMException,
EmptyStackException,
EnumConstantNotPresentException,
EventException,
IllegalArgumentException,
IllegalMonitorStateException,
IllegalPathStateException,
IllegalStateException,
ImagingOpException,
IncompleteAnnotationException,
IndexOutOfBoundsException,
JMRuntimeException,
LSException,
MalformedParameterizedTypeException,
MirroredTypeException,
MirroredTypesException,
MissingResourceException,
NegativeArraySizeException,
NoSuchElementException,
NoSuchMechanismException,
NullPointerException,
ProfileDataException,
ProviderException,
RasterFormatException,
RejectedExecutionException,
SecurityException,
SystemException,
TypeConstraintException,
TypeNotPresentException,
UndeclaredThrowableException,
UnknownAnnotationValueException,
UnknownElementException,
UnknownTypeException,
UnmodifiableSetException,
UnsupportedOperationException,
WebServiceException 

47

Виняток встановлено, а RuntimeException не встановлено.

Перевірений означає, що компілятор вимагає, щоб ви обробляли виняток у лові, або оголошували ваш метод як його кидання (або один із його суперклассів).

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


15

Класи виключень під час виконання (RuntimeException та його підкласи) звільнені від перевірки часу компіляції, оскільки компілятор не може встановити, що виключення під час виконання не можуть відбуватися. (від JLS).

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

Нижче фрагменти коду пояснюють цей момент:

//Create your own exception class subclassing from Exception
class MyException extends Exception {
    public MyException(final String message) {
        super(message);
    }
}

public class Process {
    public void execute() {
        throw new RuntimeException("Runtime");
    }  
    public void process() throws MyException {
        throw new MyException("Checked");
    }
}

У наведеному вище визначенні класу Process Process метод executeможе кинути RuntimeException, але в декларації методу не потрібно вказувати, що він кидає RuntimeException .

Метод processкидає перевірений виняток, і він повинен оголосити, що він буде кидати перевірений виняток типу MyException і, не виконуючи цього, буде помилкою компіляції.

Вищеописане визначення класу вплине на код, який також використовує клас Process .

Виклик new Process().execute()є дійсним викликом, коли як виклик форми new Process().process()видає помилку компіляції. Це пояснюється тим, що клієнтський код повинен вжити заходів для обробки MyException(скажімо, виклик до процесу () може бути укладений у блок "пробувати / ловити").


13

Правильне використання RuntimeException?

З неперевірених винятків - суперечки :

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

Зауважте, що неперевірений виняток - це похідне, RuntimeExceptionа перевірене виключення - похідне Exception.

Навіщо кидати a, RuntimeExceptionякщо клієнт не може нічого зробити, щоб відновити виняток? У статті пояснюється:

Винятки під час виконання програми представляють проблеми, що є результатом проблеми програмування, і, таким чином, клієнтський код API не може обґрунтовано очікувати відновлення з них або будь-яким чином їх обробляти. Такі проблеми включають арифметичні винятки, такі як ділення на нуль; винятки з вказівниками, такі як спроба отримати доступ до об'єкта через нульову посилання; та індексація винятків, наприклад, спроба отримати доступ до елемента масиву через занадто великий або занадто малий індекс.


5

З документації на oracle:

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

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

RuntimeExceptions - це як "винятки з недійсного використання api", приклади runtimeexceptions: IllegalStateException, NegativeArraySizeException, NullpointerException

За винятками ви повинні чітко це впіймати, оскільки ви все одно можете щось відновити. Прикладами винятків є: IOException, TimeoutException, PrintException ...


4

Простими словами, якщо ваш клієнт / користувач може відновитись після винятку, тоді зробіть це перевіреним винятком , якщо ваш клієнт не може нічого зробити для відновлення з винятку, тоді зробіть це " Не перевірено RuntimeException" . Наприклад, RuntimeException була б програмною помилкою, як поділ на нуль, жоден користувач не може нічого з цим зробити, крім самого програміста, тоді це RuntimeException .


3

RuntimeException - це дочірній клас винятку класу

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

Hierchy є

java.lang.Object

--- java.lang.Throwable

------- java.lang.Exception

------------- java.lang.RuntimeException


0

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

Якщо ви хочете досягти чистого інтерфейсу, використовуйте успадкування для підкласу різних типів винятків, яке має ваше додаток, а потім викрийте батьківський виняток.


0

Є два типи винятків. Ви можете відновити після перевіреного винятку, якщо ви отримаєте такий виняток. Виняток із виконання часу є непоправними, винятки з виконання - це помилки програмування, і програміст повинен піклуватися про це під час написання коду, і продовження виконання цього може призвести до неправильного результату. Винятки під час виконання - це порушення попередньої умови. у вас масив розміром 10, і ви намагаєтеся отримати доступ до 11-го елемента, він викине ArrayIndexOutOfBoundException


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

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

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

  4. Визначте клас та зробіть його дитиною для винятку або запустити час винятку

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