RuntimeException & Error

В иерархии исключений потомки RuntimeException, а Error - исключения во время выполнения/ошибки.

Разница между двумя: те, что находятся под RuntimeException, те, которые вызваны плохим программированием/дизайном, а также Error те, которые не могут/не должны контролироваться разработчиком.

Для кодирования исключения в приложении, например, бросать исключение, когда что-то происходит в бизнес-логике, RuntimeException.

Вопрос в том, в чем именно заключается разница между расширением RuntimeException и расширение Error - за исключением того, что простирающийся Error - это плохая практика?

Ответ 1

Оба Error и RuntimeException - это исключенные исключения, что означает, что они указывают на недостаток программы и обычно не должны быть пойманы. (NullPointerException, IndexOutOfBoundsException и т.д.)

Я думаю, что основное различие между ними состоит в том, что RuntimeException указывает на наличие ошибки в программе, а Error - это что-то, что является фатальным, но из управляющего программы. (OutOfMemorryError, ThreadDeath и т.д.)

Поэтому подклассификация Error является плохой практикой, потому что ошибка обычно не является чем-то, что может быть исправлено вашей программой во время выполнения. В вашей программе, если вам нужно что-то бросить, используйте Exception.

Ответ 2

Q - это то, в чем различие между RuntimeException и расширение ошибки - за исключением того, что расширение Error плохая практика?

Вы уже упоминали основные отличия. Спецификация языка Java говорит то же самое в разных терминах. Для Error он указывает

Error является суперклассом всех исключений, из которых программы обычно не ожидают восстановления.

В RuntimeException он указывает

Класс RuntimeException является прямым подклассом Exception. RuntimeException является суперклассом всех исключений, которые могут быть брошенных по многим причинам во время оценки выражения, но из которых восстановление может быть возможно.

Что вы должны убрать из этих цитат, так это то, что вы обычно увидите

try {
   ...
} catch (Exception e) { // catches RuntimeException
   ...
}

как catch для всех случаев, так как Exception является супер-типом RuntimeException. Но вы почти никогда не увидите (я его никогда не видел)

try {
   ...
} catch (Error e) {
   ...
}