Что такое java.lang.StackOverflowError
Выдается ошибка java.lang.StackOverflowError
, указывающая, что стек приложения исчерпан из-за глубокой рекурсии, т.е. ваша программа /сценарий слишком глубоко повторяется.
Подробности
StackOverflowError
расширяет VirtualMachineError
класс, который указывает, что JVM была или закончиласьресурсов и не может работать дальше.VirtualMachineError
, расширяющий класс Error
, используется для указания тех серьезных проблем, которые приложение не должно улавливать.Метод может не объявлять такие ошибки в своем предложении throw
, поскольку эти ошибки являются ненормальными условиями, которые никогда не ожидались.
Пример
Minimal, Complete, and Verifiable Example
:
package demo;
public class StackOverflowErrorExample {
public static void main(String[] args)
{
StackOverflowErrorExample.recursivePrint(1);
}
public static void recursivePrint(int num) {
System.out.println("Number: " + num);
if(num == 0)
return;
else
recursivePrint(++num);
}
}
Консольный вывод
Number: 1
Number: 2
.
.
.
Number: 8645
Number: 8646
Number: 8647Exception in thread "main" java.lang.StackOverflowError
at java.io.FileOutputStream.write(Unknown Source)
at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
at java.io.BufferedOutputStream.flush(Unknown Source)
at java.io.PrintStream.write(Unknown Source)
at sun.nio.cs.StreamEncoder.writeBytes(Unknown Source)
at sun.nio.cs.StreamEncoder.implFlushBuffer(Unknown Source)
at sun.nio.cs.StreamEncoder.flushBuffer(Unknown Source)
at java.io.OutputStreamWriter.flushBuffer(Unknown Source)
at java.io.PrintStream.newLine(Unknown Source)
at java.io.PrintStream.println(Unknown Source)
at demo.StackOverflowErrorExample.recursivePrint(StackOverflowErrorExample.java:11)
at demo.StackOverflowErrorExample.recursivePrint(StackOverflowErrorExample.java:16)
.
.
.
at demo.StackOverflowErrorExample.recursivePrint(StackOverflowErrorExample.java:16)
Объяснение
Когда вызов функции вызывается приложением Java, кадр стека выделяется в стеке вызовов .stack frame
содержит параметры вызванного метода, его локальные параметры и адрес возврата метода.Адрес возврата обозначает точку выполнения, с которой выполнение программы должно продолжаться после возврата вызванного метода.Если для нового кадра стека нет места, виртуальная машина Java (JVM) выбрасывает StackOverflowError
.
Наиболее распространенный случай, который может исчерпать приложение Java.стек рекурсия.В рекурсии метод вызывает себя во время выполнения.Recursion
один из самых мощных методов программирования общего назначения, но его следует использовать с осторожностью, чтобы избежать StackOverflowError
.
Ссылки