Просто любопытно. In an answer об улавливании StackOverflowErrors кто-то писал: «Конечно, бывают ситуации, когда переполнение стека может оставить приложение непоследовательным, как исчерпание памяти». Что особенного в StackOverflowErrors, что они угрожают испортить состояние приложения больше, чем, скажем, исключение NullPointerException в случае ошибки? Одна вещь, о которой я могу думать, это то, что StackOverflowError может возникать в местах, где обычно никогда не возникает исключение (или другое Throwable, если на то пошло) (например, простой getter), поэтому программа, вероятно, не готова к этому. Есть ли еще дьявольские проблемы?Какое вредоносное средство при использовании StackOverflowError?
ответ
Ошибка переполнения стека вовсе не означает, что память исчерпана и не делает что-то непоследовательное как таковое.
Но ошибка переполнения стека, как правило, является ошибкой. Вы должны исправить ошибку, а не ловить исключение. Не используйте систему исключений, чтобы скрыть ошибки.
Даже если вы знаете, что существует риск слишком глубокого стека (например, исследование графика), есть более эффективные способы управления этим, чем позволить взорвать стек.
От the Javadoc of the Error superclass:
об ошибке подклассом Throwable, что указывает на серьезные проблемы , что разумное приложение не должно попытаться поймать. Большинство таких ошибок являются ненормальными условиями. Ошибка ThreadDeath, хотя и является «нормальным» условием, является также подклассом Error, потому что большинство приложений не должны пытаться его поймать.
Забавная вещь ... вы на самом деле не можете поймать эту ошибку. VM выйдет из строя, прежде чем вы сможете что-либо сделать. –
@PaulNikonowicz - Собственно, вы можете поймать его ... если ваша JVM правильно реализована. Вам просто нужно поймать его достаточно далеко, чтобы было достаточно места для стека, чтобы делать то, что нужно сделать обработчику. –
Даже если это действительно был OutOfMemoryError - почему бы это сделать что-то непоследовательное - больше, чем любая другая ошибка, приводящая к исключению? BTW: В приличном приложении вам нужно поймать все - включая ошибки - где-то на верхнем уровне приложения, чтобы избежать представления enduser с помощью stacktrace и, возможно, некоторые сообщения об ошибках и сообщения об ошибках. –
ошибка является серьезной проблемой, которая не должна быть пойманы поэтому: тоже не поймать супер класс (Throwable) если метод выдает ошибку, вам не придется объявить бросками придаточного
поведение приложения часто не предсказуемы после ошибки - ошибки указывают на ненормальное состояние
Так что, если StackOverflowError было брошено, приложение достигло максимума стека-мест на данный момент. Вы можете перепроверить свое приложение для запуска, например. сборщик мусора раньше.
Спасибо за ответ. Я не совсем понимаю, что делает сборщик мусора. Во всяком случае, мой вопрос состоял в том, может ли SOE иметь худшие последствия, чем я указал в вопросе. –
- 1. StackOverflowError при использовании HTTPUrlConnection
- 2. StackOverflowError при использовании Gson
- 3. StackoverflowError при использовании Firebase
- 4. StackOverflowError при использовании ViewCompat
- 5. Какое средство визуализации для браузера?
- 6. shell: Какое средство числа предложения
- 7. Я получаю StackOverflowError при использовании addonTextChangeListener
- 8. StackOverflowError при использовании getattr в Jython
- 9. какое средство вызова команды (param1, param2, ...)
- 10. StackOverflowError при показе ProgressDialog
- 11. StackOverflowError при написании Parcelable
- 12. StackOverflowError при реализации QuickSort
- 13. StackOverflowError при использовании JsonSerializer с Gson и Scala
- 14. бесконечный цикл/StackOverflowError при использовании Apache MyFaces 2.0
- 15. Какое значение присваивается при использовании инструкции MOV?
- 16. Какое имя передается Nginx при использовании CNAME
- 17. Какое ограничение при использовании res HSQLDB?
- 18. Какое лучшее средство обращения, когда hibernate/HQL слишком ограничен?
- 19. StackoverflowError
- 20. StackOverFlowError при создании унаследованной активности
- 21. StackOverflowError при генерации дерева json
- 22. StackOverflowError при переопределении Hashtable.contains() java
- 23. StackOverflowError при строительстве моего проекта
- 24. объективизация - StackOverflowError при регистрации классов
- 25. XWiki: StackOverflowError при импорте XAR
- 26. StackOverflowError при удалении объекта ArrayList
- 27. Hibernate бросает StackOverflowError при запросе
- 28. StackOverflowError при выполнении внешней сортировки
- 29. StackOverFlowError при переходе по опциям
- 30. StackOverflowError при попытке напечатать StackTrace
Я думаю, что SOE обычно происходит из-за ошибки кодирования, а не ошибки данных. Другие комментарии говорят: «Ошибка переполнения стека, как правило, является ошибкой», но также не является NPE? –
@ user2310289 Существует множество способов падения на NPE, поэтому многие могут захотеть пропустить некоторые тесты и иногда полагаться на систему try/catch. Но да, ловить NPE тоже должно быть редко. –
Обратите внимание, что это ошибка! не исключение! –