2013-08-27 3 views
8

Просто любопытно. In an answer об улавливании StackOverflowErrors кто-то писал: «Конечно, бывают ситуации, когда переполнение стека может оставить приложение непоследовательным, как исчерпание памяти». Что особенного в StackOverflowErrors, что они угрожают испортить состояние приложения больше, чем, скажем, исключение NullPointerException в случае ошибки? Одна вещь, о которой я могу думать, это то, что StackOverflowError может возникать в местах, где обычно никогда не возникает исключение (или другое Throwable, если на то пошло) (например, простой getter), поэтому программа, вероятно, не готова к этому. Есть ли еще дьявольские проблемы?Какое вредоносное средство при использовании StackOverflowError?

+1

Я думаю, что SOE обычно происходит из-за ошибки кодирования, а не ошибки данных. Другие комментарии говорят: «Ошибка переполнения стека, как правило, является ошибкой», но также не является NPE? –

+0

@ user2310289 Существует множество способов падения на NPE, поэтому многие могут захотеть пропустить некоторые тесты и иногда полагаться на систему try/catch. Но да, ловить NPE тоже должно быть редко. –

+1

Обратите внимание, что это ошибка! не исключение! –

ответ

10

Ошибка переполнения стека вовсе не означает, что память исчерпана и не делает что-то непоследовательное как таковое.

Но ошибка переполнения стека, как правило, является ошибкой. Вы должны исправить ошибку, а не ловить исключение. Не используйте систему исключений, чтобы скрыть ошибки.

Даже если вы знаете, что существует риск слишком глубокого стека (например, исследование графика), есть более эффективные способы управления этим, чем позволить взорвать стек.

От the Javadoc of the Error superclass:

об ошибке подклассом Throwable, что указывает на серьезные проблемы , что разумное приложение не должно попытаться поймать. Большинство таких ошибок являются ненормальными условиями. Ошибка ThreadDeath, хотя и является «нормальным» условием, является также подклассом Error, потому что большинство приложений не должны пытаться его поймать.

+0

Забавная вещь ... вы на самом деле не можете поймать эту ошибку. VM выйдет из строя, прежде чем вы сможете что-либо сделать. –

+1

@PaulNikonowicz - Собственно, вы можете поймать его ... если ваша JVM правильно реализована. Вам просто нужно поймать его достаточно далеко, чтобы было достаточно места для стека, чтобы делать то, что нужно сделать обработчику. –

+0

Даже если это действительно был OutOfMemoryError - почему бы это сделать что-то непоследовательное - больше, чем любая другая ошибка, приводящая к исключению? BTW: В приличном приложении вам нужно поймать все - включая ошибки - где-то на верхнем уровне приложения, чтобы избежать представления enduser с помощью stacktrace и, возможно, некоторые сообщения об ошибках и сообщения об ошибках. –

0

ошибка является серьезной проблемой, которая не должна быть пойманы поэтому: тоже не поймать супер класс (Throwable) если метод выдает ошибку, вам не придется объявить бросками придаточного

поведение приложения часто не предсказуемы после ошибки - ошибки указывают на ненормальное состояние

Так что, если StackOverflowError было брошено, приложение достигло максимума стека-мест на данный момент. Вы можете перепроверить свое приложение для запуска, например. сборщик мусора раньше.

+0

Спасибо за ответ. Я не совсем понимаю, что делает сборщик мусора. Во всяком случае, мой вопрос состоял в том, может ли SOE иметь худшие последствия, чем я указал в вопросе. –

Смежные вопросы