java.lang.stackoverflowerror_java.lang.StackOverflowError——如何解决StackOverflowError错误

java.lang.stackoverflowerror_java.lang.StackOverflowError——如何解决StackOverflowError错误StackOverflo 在程序栈空间耗尽时抛出 通常是深度递归导致 StackOverflo 继承了 VirtualMachi 类 后者表示 JVM 已被破坏或资源耗尽 更进一步 VirtualMachi 继承自 Error 类 应用程序不应该捕获这种严重的错误 不要再 throw 语句里面抛出这样的错误 因为这些错误是不应该发生的异常条件 StackOverflo

StackOverflowError在程序栈空间耗尽时抛出,通常是深度递归导致。StackOverflowError继承了VirtualMachineError类,后者表示JVM已被破坏或资源耗尽。更进一步,VirtualMachineError继承自Error类,应用程序不应该捕获这种严重的错误。不要再throw语句里面抛出这样的错误,因为这些错误是不应该发生的异常条件。StackOverflowError从Java 1.0版本就已存在。

StackOverflowError构造函数

StackOverflowError()和StackOverflowError(String s),后者的String参数指明了抛出错误的类名。

The StackOverflowError in Java

当一个函数被Java程序调用的时候,就会在调用栈上分配栈帧。栈帧包含被调用函数的参数、局部变量和返回地址。返回地址指示了当函数执行完毕之后下一步该执行哪里。如果创建栈帧时没有内存空间,JVM就会抛出StackOverflowError。

最常见的耗尽Java栈的案例是递归。在递归操作中,函数执行时会调用自己。使用递归要小心,以免抛出StackOverflowError错误。如下的例子演示了递归如何抛出StackOverflowError:

public class StackOverflowErrorExample {

public static void recursivePrint(int num) {

System.out.println(“Number: ” + num);

if(num == 0)

return;

else

recursivePrint(++num);

}

public static void main(String[] args) {

StackOverflowErrorExample.recursivePrint(1);

}

}

如果num为0,递归就会终止,但是这里一开始传入1,每次递归都自增1,递归永远不会终止。

使用-Xss1M参数指定线程栈空间大小为1M,这个例子的执行结果如下:

Number: 1

Number: 2

Number: 3

Number: 6262

Number: 6263

Number: 6264

Number: 6265

Number: 6266

Exception in thread “main” java.lang.StackOverflowError

at java.io.PrintStream.write(PrintStream.java:480)

at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)

at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)

at sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:104)

at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:185)

at java.io.PrintStream.write(PrintStream.java:527)

at java.io.PrintStream.print(PrintStream.java:669)

at java.io.PrintStream.println(PrintStream.java:806)

at StackOverflowErrorExample.recursivePrint(StackOverflowErrorExample.java:4)

at StackOverflowErrorExample.recursivePrint(StackOverflowErrorExample.java:9)

at StackOverflowErrorExample.recursivePrint(StackOverflowErrorExample.java:9)

at StackOverflowErrorExample.recursivePrint(StackOverflowErrorExample.java:9)

More about the StackOverflowError in Java

下面的例子演示了类之间有循环关系时的风险。

class A {

private int aValue;

private B bInstance = null;

public A() {

aValue = 0;

bInstance = new B();

}

@Override

public String toString() {

return “”;

}

}

class B {

private int bValue;

private A aInstance = null;

public B() {

bValue = 10;

aInstance = new A();

}

@Override

public String toString() {

return “”;

}

}

public class StackOverflowErrorToStringExample {

public static void main(String[] args) {

A obj = new A();

System.out.println(obj.toString());

}

}

当创建A对象的时候需要创建B对象,创建B对象的时候又要创建A对象,在两个类之间形成了循环依赖,最终导致StackOverflowError。输出结果:

Exception in thread “main” java.lang.StackOverflowError

at main.java.B.(StackOverflowErrorToStringExample.java:24)

at main.java.A.(StackOverflowErrorToStringExample.java:9)

at main.java.B.(StackOverflowErrorToStringExample.java:24)

at main.java.A.(StackOverflowErrorToStringExample.java:9)

at main.java.B.(StackOverflowErrorToStringExample.java:24)

at main.java.A.(StackOverflowErrorToStringExample.java:9)

如何处理StackOverflowError

最简单的方法就是细致的检查stack trace,找出行号的重复模式。这些重复的行号代表了被递归调用的代码。仔细审查代码,理解为何递归不终止。

如果你确认递归实现没有问题,你可以通过-Xss参数增加栈的大小,这个参数可以在项目配置或命令行指定。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231273.html原文链接:https://javaforall.net

(0)
上一篇 2026年1月17日 下午6:01
下一篇 2026年1月17日 下午6:22


相关推荐

  • 手动ghost备份系统步骤_手动ghost备份图解

    手动ghost备份系统步骤_手动ghost备份图解备份前我们需要ghost,在此我提供下,在压缩文件下找到ghost百度网盘:http://pan.baidu.com/s/1mh77iWS 密码:ivxq进入ghost界面以后,按回车键,进入下一个操作界面。如下图所示:使用键盘上的方向键依次选择“Local”(本机)“Partition”(分区)“ToImage”(到镜像)然后

    2025年9月22日
    5
  • 业务架构师如何进阶成长[通俗易懂]

    业务架构师如何进阶成长[通俗易懂]一、前言接触业务架构工作之后,除了单位提供的方法论外,为了做好这项工作,认真学习了软件过程、系统分析与设计、架构设计、设计模式、Java语言等内容,并研读了敏捷开发、领域驱动设计、工作流分析等方面的书籍,为了拓展对新技术的理解,在人工智能和区块链两方面也阅读了一些著作,总体而言,不够系统,都是为了能够更好地理解企业级业务架构的方法论及其向技术端的传导。除了恶补基础知识,更重要的当然是实践,珍惜每一个设计任务,珍惜每一次与业务人员、技术人员的沟通机会…

    2022年10月12日
    6
  • android之回调函数的用法和意义

    CallBack是回调的意思,一般称之为回调函数百科的解释:http://baike.baidu.com/link?url=8yMUwVEFRzxR4JGMxVN_UnFgJIH4WTnsybuW5NfwgKqVKP8NtShfJnNNeY9mBzRT用一个比较形象的例子:你饿了,想吃饭,就一会去问你妈一声”开饭没有啊?”这就是正常函数调用.但是今天你妈包饺子,花的时间比较长,

    2022年3月10日
    46
  • 【n8n教程】:n8n CLI 命令行工具

    【n8n教程】:n8n CLI 命令行工具

    2026年3月15日
    3
  • Nano Banana Pro 中文提示词完整教程:让 AI 准确渲染中文文字

    Nano Banana Pro 中文提示词完整教程:让 AI 准确渲染中文文字

    2026年3月15日
    2
  • CAP的分区容错性

    CAP的分区容错性一直没有理解CAP中P的分区容错性是什么意思?系统部分节点出现故障后,连接正常节点还可以使用系统提供的服务

    2022年7月25日
    12

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号