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
содержит параметры вызываемого метода, его локальные параметры и обратный адрес метода. Адрес возврата обозначает точку выполнения, из которой выполнение программы должно продолжаться после возврата вызванного метода. Если нет места для нового стека кадров, то StackOverflowError
создается виртуальной машиной Java (JVM).
Наиболее распространенным случаем, который может вызывать стек Java-приложения, является рекурсия. В рекурсии метод запускается во время его выполнения. Recursion
один из самых мощных методов программирования общего назначения, но его следует использовать с осторожностью, чтобы избежать StackOverflowError
.