Ошибка (особенно подкласс VirtualMachineError) указывает на то, что JVM обнаружила внутреннюю проблему - такую, которая означает, что ее внутреннее состояние больше не может быть согласованным. Если вы обнаружите ошибку и попытаетесь восстановить ее, поведение в будущем не определено. Причина, по которой ошибки являются Throwable, заключается в том, что они могут быть выброшены - например, вы можете сделать это самостоятельно для ошибок в собственной библиотеке, из которой невозможно восстановить данные (например, библиотека могла записать в память JVM или повредить свое внутреннее статическое состояние ). В случае всех Throwables используется одно и то же оборудование для ходьбы и получения стека - было бы глупо иметь другой механизм, который бы делал то же самое.
Большинство ошибок в JVM, которые не являются VirtualMachineErrors, представляют собой ситуации, когда собственная библиотека могла повредить свое статическое состояние - например, AWTError, ZipError.
Однако в некоторых редких случаях обнаружение ошибки является нормальным: AssertionError в инфраструктуре тестирования и LinkageError, где вам приходится иметь дело с отсутствием / наличием различных версий библиотек во время выполнения. Это довольно редкое требование, и с ним можно лучше справиться через рефлексию.