Как обрабатывать StackOverflowError в Java? - PullRequest
16 голосов
/ 04 июня 2009

Как обработать StackOverflowError в Java?

Ответы [ 13 ]

0 голосов
/ 05 июня 2009

Простой,

Посмотрите на трассировку стека, которую создает StackOverflowError, чтобы вы знали, где в вашем коде это происходит, и используйте его, чтобы выяснить, как переписать ваш код, чтобы он не вызывал себя рекурсивно (вероятная причина вашей ошибки) это больше не повторится.

StackOverflowErrors - это не то, что нужно обрабатывать с помощью предложения try ... catch, но оно указывает на основной недостаток в логике вашего кода, который вы должны исправить.

0 голосов
/ 04 июня 2009

Как уже упоминалось многими в этом потоке, общей причиной этого является рекурсивный вызов метода, который не завершается. Там, где это возможно, избегайте переполнения стека, и если вы делаете это при тестировании, вы должны рассматривать это в большинстве случаев как серьезную ошибку. В некоторых случаях вы можете настроить размер стека потоков в Java, чтобы он был больше для обработки некоторых обстоятельств (большие наборы данных управляются в локальном хранилище стека, длинные рекурсивные вызовы), но это увеличит общий объем памяти, который может привести к проблемам в количестве темы доступны в ВМ. Как правило, если вы получаете это исключение, поток и любые локальные данные в этом потоке должны рассматриваться как всплывающие и не используемые (то есть подозрительные и, возможно, поврежденные).

0 голосов
/ 04 июня 2009

Трассировка стека должна указывать на природу проблемы. При чтении трассировки стека должно быть некоторое очевидное зацикливание.

Если это не ошибка, вам нужно добавить счетчик или какой-то другой механизм, чтобы остановить рекурсию до того, как рекурсия станет настолько глубокой, что это приведет к переполнению стека.

Примером этого может быть, если вы обрабатываете вложенный XML в модели DOM с рекурсивными вызовами, а XML вложен настолько глубоко, что вызывает переполнение стека вложенными вызовами (маловероятно, но возможно). Это должно быть довольно глубокое вложение, чтобы вызвать переполнение стека.

...