Без броска VirtualMachineError гарантирует

Я пришел на Java с С++. В мире С++ мы обращаем внимание на безопасность исключений и отмечаем, что мутаторы могут предоставлять разные гарантии перед исключениями, которые выдает сам мутатор или метод, которым он делегирует (минимальный, сильный, не-бросок). Реализация метода, который имеет сильную гарантию исключения, требует, чтобы некоторые основные операции гарантировали никогда не выдавать исключение. JLS делает утверждения о том, какие операции могут выполнять какие-либо исключения, но ошибка VirtualMachineError представляет проблему. Введите JLS:

внутренняя ошибка или ограничение ресурсов предотвращает виртуальную машина от реализации семантики программирования Java язык; в этом случае экземпляр подкласса VirtualMachineError.

JLS больше не говорит о VirtualMachineError. "Внутренняя ошибка" означает ошибку в JVM, поэтому меня это не интересует: перед ошибками в JVM все ставки отключены. Но как насчет "ограничения ресурсов"? Существуют ли какие-либо операции, гарантированные никогда не сбой из-за ограничения ресурсов?

Ответ 1

Введите Спецификация виртуальной машины Java:

Эта спецификация не может предсказать, где внутренние ошибки или ресурсы могут возникнуть ограничения и не о них можно сообщать. Таким образом, любой из подклассов VirtualMachineErrorопределенные ниже, могут быть выброшены в любое время во время работы Виртуальная машина Java:

В Java поэтому исключение исключений не может быть сделано в отношении исключений VirtualMachineError. Все гарантии исключений должны подлежать квалификации "... но не если выбрано VirtualMachineError". Это один из способов, с помощью которых Java отличается от С++.

Это также говорит о том, что не хватает места в поиске исключения VirtualMachineError, потому что программа находится в состоянии undefined, если она была выбрана. К сожалению, это исключения OutOfMemoryError. Несчастливо, потому что если одна из нескольких задач терпит неудачу, потому что ей требуется слишком много памяти, мы могли бы продолжить другие задачи.

Ответ 2

Если это ограничение ресурсов, в первую очередь, никаких операций не происходит. Вот ссылка для отличного примера, чтобы иметь VirtualMachineError. Ошибка виртуальной машины

Эта ошибка не является чем-то вроде OutofMemoryError, где к тому времени могут выполняться некоторые операции.

Ответ 3

Я вижу, что вы ответили на свой собственный вопрос, и я могу понять, почему это было бы слегка удивительно для вас, исходя из строгого фона С++. Это просто реальность управляемой памяти (виртуальных) машин, и она не ограничивается только java. Память может закончиться, поскольку JVM ограничена тем, сколько кучи она может использовать (настраивается в командной строке java).

Несколько аналогичным, но не эквивалентным, в мире С++/машинного кода будет GENERAL_PROTECTION_FAULT (или SEGMENTATION_FAULT, если вы на * NIX), который вы получите при попытке адресовать память, которая не была выделена или находится вне ваше виртуальное адресное пространство. Предоставление "надежной гарантии исключения" перед лицом этого сценария одинаково сложно, поскольку причиной может быть ошибка в коде или полностью вне контроля программы.

Ответ 4

В Java вы можете вызвать Thread.stop() или stop (Throwable) в любое время. Большинство ошибок считаются настолько критичными, что вы не должны пытаться их обрабатывать, если не знаете, что делаете.

Разработав приложение на стороне сервера Java на 12 лет, я могу сказать, что никогда не слышал о том, что кто-то беспокоится о том, что будут выбрасываться случайные исключения. Я подозреваю, что это просто не проблема, о которой вам нужно беспокоиться в Java.

Можете ли вы привести пример того, почему вы считаете, что вам нужна гарантия, поскольку, вероятно, будет другой способ решить проблему?