Что фактически вызывает java.lang.StackOverflowError, как правило, является непреднамеренной рекурсией. Для меня часто бывает, когда я намеревался вызвать супер метод для метода overidden. Например, в этом случае:
public class Vehicle {
public void accelerate(float acceleration, float maxVelocity) {
// set the acceleration
}
}
public class SpaceShip extends Vehicle {
@Override
public void accelerate(float acceleration, float maxVelocity) {
// update the flux capacitor and call super.accelerate
// oops meant to call super.accelerate(acceleration, maxVelocity);
// but accidentally wrote this instead. A StackOverflow is in our future.
this.accelerate(acceleration, maxVelocity);
}
}
Во-первых, полезно знать, что происходит за кулисами, когда мы вызываем функцию. Аргументы и адрес того, где был вызван метод, помещаются в стек (см. 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, как правило, довольно легко разрешать.
В теории также возможно переполнение стека без рекурсии, но на практике это выглядит как довольно редкий случай.
Если я вас правильно понимаю, у вас есть логика инициализации, которая должна была произойти только один раз, так что о том, чтобы сказать нам, раз за раз?
Что означает эта логика? На самом деле нам потребуется больше информации, чтобы помочь вам на уровне разработки.
Чего ты хочешь достичь?