stackoverflowerror java что это
Что вызывает Java.lang.StackOverflowError
Проверьте любые рекурсивные вызовы методов. В основном это вызвано, когда есть рекурсивный вызов метода. Простой пример
Здесь System.out.println (i); будет повторно помещаться в стек при вызове метода testMethod.
Как правило, причиной этого является бесконечная рекурсия, но если бы вы видели это, ваша трассировка стека имела бы более 5 кадров.
На самом деле Java.lang.StackOverflowError обычно является непреднамеренной рекурсией. Для меня это часто, когда я намеревался вызвать супер метод для метода overidden. Например, в этом случае:
Во-первых, полезно знать, что происходит за кулисами, когда мы вызываем функцию. Аргументы и адрес, где был вызван метод, помещаются в стек (см. http://en.wikipedia.org/wiki/Stack_ (abstract_data_type) #Runtime_memory_management ), чтобы вызываемый метод мог получить доступ к аргументам и, таким образом, когда вызываемый метод будет завершен, выполнение может продолжаться после вызова. Но поскольку мы вызываем this.accelerate (ускорение, maxVelocity) рекурсивно (рекурсия происходит свободно, когда метод вызывает сам себя. Для получения дополнительной информации см. http://en.wikipedia.org/wiki/Recursion_ (computer_science) =) мы находимся в ситуации, известной как бесконечная рекурсия, и мы продолжаем накапливать аргументы и адрес возврата в стеке вызовов. Поскольку стек вызовов имеет конечный размер, в конечном итоге у нас заканчивается свободное пространство. Недостаток места в стеке вызовов называется переполнением. Это потому, что мы пытаемся использовать больше стекового пространства, чем у нас, и данные буквально переполняют стек. В языке программирования Java это приводит к исключению времени выполнения Java.lang.StackOverflow и немедленно останавливает программу.
Приведенный выше пример несколько упрощен (хотя он случается со мной больше, чем я хотел бы признать). То же самое может произойти в более широком смысле, что усложнит отслеживание. Тем не менее, в общем случае StackOverflow обычно довольно легко разрешить, как только он происходит.
В теории также возможно переполнение стека без рекурсии, но на практике это может показаться довольно редким событием.
Что такое Java.lang.StackOverflowError
Ошибка Java.lang.StackOverflowError генерируется, чтобы указать, что стек приложения исчерпан из-за глубокой рекурсии, т. Е. Ваша программа/сценарий повторяется слишком глубоко.
Подробности
Класс StackOverflowError NAME _ extends VirtualMachineError NAME _, который указывает, что JVM исчерпала или исчерпала ресурсы и не может работать дальше. VirtualMachineError NAME _, который расширяет класс Error NAME _, используется для указания тех серьезных проблем, которые приложение не должно улавливать. Метод может не объявлять такие ошибки в своем предложении throw NAME _, поскольку эти ошибки являются ненормальными условиями, которые никогда не ожидались.
Пример
Minimal, Complete, and Verifiable Example :
Консольный выход
Explaination
Когда вызов функции вызывается приложением Java, в стек вызовов выделяется стек фрейма. stack frame содержит параметры вызванного метода, его локальные параметры и адрес возврата метода. Адрес возврата обозначает точку выполнения, с которой выполнение программы должно продолжаться после возврата вызванного метода. Если для нового фрейма стека нет места, StackOverflowError NAME _ генерируется виртуальной машиной Java (JVM).
Наиболее распространенным случаем, который может исчерпать стек приложения Java, является рекурсия. В рекурсии метод вызывает себя во время выполнения. Recursion NAME _ один из самых мощных методов программирования общего назначения, но его следует использовать с осторожностью, чтобы избежать StackOverflowError NAME _.
Рекомендации
Когда вызов функции вызывается приложением Java, в стеке вызовов выделяется кадр стека. Кадр стека содержит параметры вызванного метода, его локальные параметры и адрес возврата метода.
Наиболее распространенным случаем, который может исчерпать стек приложения Java, является рекурсия.
Что вызывает java.lang.StackOverflowError
Проверьте наличие повторных вызовов методов. В основном это вызвано рекурсивным вызовом метода. Простой пример:
Здесь System.out.println (i); будет многократно помещаться в стек при вызове testMethod.
Обычно причиной этого является бесконечная рекурсия, но если бы вы это видели, ваша трассировка стека имела бы более 5 кадров.
На самом деле причиной java.lang.StackOverflowError обычно является непреднамеренная рекурсия. Для меня это часто, когда я намеревался вызвать супер-метод для скрытого метода. Например, в этом случае:
Во-первых, полезно знать, что происходит за кулисами, когда мы вызываем функцию. Аргументы и адрес того места, где был вызван метод, помещаются в стек (см. Http://en.wikipedia.org/wiki/Stack_(abstract_data_type)#Runtime_memory_management ), чтобы вызываемый метод мог получить доступ к аргументам и чтобы при вызываемый метод завершен, выполнение может продолжаться после вызова. Но поскольку мы вызываем this.accelerate (ускорение, maxVelocity) рекурсивно (рекурсия не является произвольной, когда метод вызывает сам себя. Для получения дополнительной информации см. Http://en.wikipedia.org/wiki/Recursion_(computer_science)) мы находимся в ситуации, известной как бесконечная рекурсия, и продолжаем накапливать аргументы и адрес возврата в стеке вызовов. Поскольку размер стека вызовов конечен, в конечном итоге нам не хватает места. Нехватка места в стеке вызовов называется переполнением. Это потому, что мы пытаемся использовать больше места в стеке, чем у нас есть, и данные буквально переполняют стек. В языке программирования Java это приводит к исключению времени выполнения java.lang.StackOverflow и немедленно останавливает программу.
Приведенный выше пример несколько упрощен (хотя со мной такое случается чаще, чем я хотел бы признать). То же самое может произойти и более обходным путем, поэтому его немного сложнее отследить. Однако в целом StackOverflow обычно довольно легко разрешить, если он возникает.
Теоретически также возможно переполнение стека без рекурсии, но на практике это может показаться довольно редким событием.
Что такое java.lang.StackOverflowError
Ошибка java.lang.StackOverflowError выдается, чтобы указать, что стек приложения был исчерпан из-за глубокой рекурсии, то есть ваша программа / сценарий рекурсии слишком глубоко.
Детали
Пример
Minimal, Complete, and Verifiable Example :
Консольный выход
Объяснение
Наиболее частым случаем, который может исчерпать стек Java-приложения, является рекурсия. В рекурсии метод вызывает себя во время выполнения. Recursion один из самых мощных методов программирования общего назначения, но его следует использовать с осторожностью, StackOverflowError чтобы избежать ошибок.
What is a StackOverflowError?
15 Answers 15
Parameters and local variables are allocated on the stack (with reference types, the object lives on the heap and a variable in the stack references that object on the heap). The stack typically lives at the upper end of your address space and as it is used up it heads towards the bottom of the address space (i.e. towards zero).
Your process also has a heap, which lives at the bottom end of your process. As you allocate memory, this heap can grow towards the upper end of your address space. As you can see, there is a potential for the heap to «collide» with the stack (a bit like tectonic plates. ).
The common cause for a stack overflow is a bad recursive call. Typically, this is caused when your recursive functions doesn’t have the correct termination condition, so it ends up calling itself forever. Or when the termination condition is fine, it can be caused by requiring too many recursive calls before fulfilling it.
However, with GUI programming, it’s possible to generate indirect recursion. For example, your app may be handling paint messages, and, whilst processing them, it may call a function that causes the system to send another paint message. Here you’ve not explicitly called yourself, but the OS/VM has done it for you.
To deal with them, you’ll need to examine your code. If you’ve got functions that call themselves then check that you’ve got a terminating condition. If you have, then check that when calling the function you have at least modified one of the arguments, otherwise there’ll be no visible change for the recursively called function and the terminating condition is useless. Also mind that your stack space can run out of memory before reaching a valid terminating condition, thus make sure your method can handle input values requiring more recursive calls.
If you’ve got no obvious recursive functions then check to see if you’re calling any library functions that indirectly will cause your function to be called (like the implicit case above).
How to Fix java.lang.StackOverflowError in Java
Table of Contents
The java.lang.StackOverflowError is a runtime error which points to serious problems that cannot be caught by an application. The java.lang.StackOverflowError indicates that the application stack is exhausted and is usually caused by deep or infinite recursion.
What Causes java.lang.StackOverflowError in Java
The java.lang.StackOverflowError occurs when the application stack continues to grow until it reaches the maximum limit. Some of the most common causes for a java.lang.StackOverflowError are:
java.lang.StackOverflowError Example in Java
Here is an example of java.lang.StackOverflowError thrown due to unintended recursion:
In this example, the recursive method print() calls itself over and over again until it reaches the maximum size of the Java thread stack since a terminating condition is not provided for the recursive calls. When the maximum size of the stack is reached, the program exits with a java.lang.StackOverflowError :
How to fix java.lang.StackOverflowError in Java
Inspect the stack trace
Carefully inspecting the error stack trace and looking for the repeating pattern of line numbers enables locating the line of code with the recursive calls. When the line is identified, the code should be examined and fixed by specifying a proper terminating condition. As an example, the error stack trace seen earlier can be inspected:
Increase Thread Stack Size (-Xss)
The stack size can be increased by changing the -Xss argument on the JVM, which can be set when starting the application. Here is an example:
Track, Analyze and Manage Java Errors With Rollbar
Managing errors and exceptions in your code is challenging. It can make deploying production code an unnerving experience. Being able to track, analyze, and manage errors in real-time can help you to proceed with more confidence. Rollbar automates Java error monitoring and triaging, making fixing errors easier than ever. Try it today.
Ошибка StackOverflowError в Java
Узнайте, как происходит одна из наиболее распространенных ошибок Java – StackOverflowError – и как ее устранить.
1. Обзор
StackOverflowError может раздражать разработчиков Java, так как это одна из самых распространенных ошибок во время выполнения, с которой мы можем столкнуться.
В этой статье мы рассмотрим, как может возникнуть эта ошибка, рассмотрев различные примеры кода, а также то, как мы можем с ней справиться.
2. Кадры стека и как происходит ошибка StackOverflowError
Давайте начнем с основ. При вызове метода в стеке вызовов создается новый кадр стека. Этот кадр стека содержит параметры вызываемого метода, его локальные переменные и адрес возврата метода, т. е. точку, из которой выполнение метода должно продолжаться после возврата вызванного метода.
Создание фреймов стека будет продолжаться до тех пор, пока не будет достигнут конец вызовов методов, найденных внутри вложенных методов.
Наиболее распространенной причиной, по которой JVM сталкивается с этой ситуацией, является unterminated/бесконечная рекурсия – в описании Javadoc для StackOverflowError упоминается, что ошибка возникает в результате слишком глубокой рекурсии в конкретном фрагменте кода.
В следующем разделе мы рассмотрим некоторые примеры кода, демонстрирующие эти сценарии.
3. Ошибка StackOverflowError в действии
В примере, показанном ниже, StackOverflowError будет вызван из-за непреднамеренной рекурсии, когда разработчик забыл указать условие завершения для рекурсивного поведения:
Здесь ошибка возникает во всех случаях для любого значения, переданного в метод:
Этот набор тестов демонстрирует этот сценарий:
В данном конкретном случае ошибки можно было бы полностью избежать, если бы условие завершения было просто сформулировано как:
Вот тест, который показывает этот сценарий на практике:
Далее мы рассмотрим, что происходит, когда экземпляр класса создается в том же классе, что и переменная экземпляра этого класса.
Как видно из следующего примера, Владелец счета создает экземпляр в качестве переменной экземпляра Владелец совместного счета :
Когда Владелец учетной записи класс создается , a StackOverflowError выбрасывается из-за рекурсивного вызова конструктора, как показано в этом тесте:
4. Работа С Ошибкой StackOverflowError
Лучшее, что можно сделать при обнаружении || StackOverflowError||, – это осторожно проверить трассировку стека, чтобы определить повторяющийся шаблон номеров строк. Это позволит нам найти код, который имеет проблемную рекурсию.
Здесь можно увидеть повторение строки № 5. Именно здесь выполняется рекурсивный вызов. Теперь это просто вопрос изучения кода, чтобы увидеть, правильно ли выполняется рекурсия.
Вот трассировка стека, которую мы получаем, выполняя ручной тест циклической зависимости (опять же, без ожидаемого исключения):
Эта трассировка стека показывает номера строк, которые вызывают проблему в двух классах, находящихся в циклической связи. Строка номер 9 класса Два и строка номер 9 класса Один указывают на местоположение внутри конструктора, где он пытается создать экземпляр другого класса.
После тщательной проверки кода и если ни одно из следующих действий (или любая другая логическая ошибка кода) не является причиной ошибки:
Было бы неплохо попытаться увеличить размер стека. В зависимости от установленной JVM размер стека по умолчанию может варьироваться.
Флаг -Xss можно использовать для увеличения размера стека либо из конфигурации проекта, либо из командной строки.