Ошибка является подклассом Throwable, который указывает на серьезные проблемы, которые разумное приложение не должно пытаться поймать. Большинство таких ошибок являются ненормальными условиями.
Теперь, так как ошибка действительно расширяет метательную, можно поймать «любую» ошибку с помощью простого заявления примерки улова следующим образом:
try{
//Error causing code here...
}catch(Error e){
//Handle error here...
}
Однако, поскольку ошибки в различных формах, заброшенная ошибка может сопровождаться изменением поведения jvm или может не сопровождаться его непредвиденными результатами.
Рассмотрите ошибку OutOfMemoryError. Когда эта ошибка выбрасывается, куча JVM может быть настолько полной, что любой тип кода обработки приводит к выбросу другого OutOfMemoryError, аннулируя любую попытку восстановления.
Кроме того, даже при работе в «первичной» нити (той, в которой запускается приложение), ошибка может привести к сбою JVM перед каждым сбросом ошибки.
Глядя на описание VirtualMachineError (из которых ошибки, такие как OutOfMemoryError, StackOverflowError, InternalError и т.д. являются подклассами) мы видим:
Брошенный, чтобы указать, что виртуальная машина Java сломаны или закончились ресурсов, необходимых для продолжения работы.
В самом javadoc говорится, что jvm больше не может продолжать работу, как правило, намного меньше, чтобы программист просто «отталкивал» их.
С другой стороны, такие ошибки, как UnsatisfiedLinkError обычно не вызывает проблем с JVM сразу и вообще могут быть обработаны (это ли хорошая практика спорно). Я лично однажды использовал структуру, которая включает обработку UnsatisfiedLinkError для определения правильной библиотеки для загрузки для JNI.
Теперь все ошибки могут быть обработаны? Теоретически, да, если мы предположим, что JVM может продолжать работать отлично, несмотря на то, что утверждается, что он провалился фатально ... При этом обрабатывается практически только небольшое количество ошибок. Являются ли это небольшое подмножество ошибок следует обращаться также весьма спорная тема.