Java 7 представила конструктор Throwable
(а также Exception
и RuntimeException
), который позволяет отключить запись стека трассировки и подавление . До сих пор я думал, что цель этой функции - сделать исключения, которые используются только внутри библиотеки, более эффективными или, возможно, для некоторых угловых случаев.
Однако в Java 7 документация java.lang.ArithmeticException
также была изменена, чтобы включить следующее:
Объекты ArithmeticException могут создаваться виртуальной машиной, как если бы подавление было отключено и / или трассировка стека была недоступна для записи.
JVM уже вели себя таким образом до Java 7, но это просто не было задокументировано? Если нет, то каково было обоснование добавления такого поведения?
Мне это кажется довольно проблематичным, например, представьте, что вы случайно делите где-то деление на 0, что приводит к ArithmeticException
. Если JVM решит отключить трассируемую трассировку стека, вы не сможете понять, где произошла ошибка, если перехватите ее несколькими кадрами выше.