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


相关推荐

  • 【SpringBoot】23、SpringBoot中整合Shiro实现权限管理

    【SpringBoot】23、SpringBoot中整合Shiro实现权限管理之前在 SSM 项目中使用过 shiro 发现 shiro 的权限管理做的真不错 但是在 SSM 项目中的配置太繁杂了 于是这次在 SpringBoot 中使用了 shiro 下面一起看看吧一 简介 ApacheShiro 是一个强大且易用的 Java 安全框架 执行身份验证 授权 密码和会话管理 使用 Shiro 的易于理解的 API 您可以快速 轻松地获得任何应用程序 从最小的移动应用程序到最大的网络和企业应用程序 三个核心组件 1 Subject 即 当前操作用户 但是 在 Shiro 中 Subje

    2026年3月19日
    2
  • pycharm 2021.2.3激活码(已测有效)

    pycharm 2021.2.3激活码(已测有效),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日
    1.4K
  • 【python教程入门学习】PyCharm下载和安装教程(包含配置Python解释器)

    【python教程入门学习】PyCharm下载和安装教程(包含配置Python解释器)PyCharm是JetBrains公司研发,用于开发 [Python]的IDE开发工具。图1所示为JetBrains公司开发的多款开发工具,其中很多工具都好评如潮,这些工具可以编写Python、C/[C++]、[C#]、DSL、Go、Groovy、[Java]、[JavaScript]、Objective-C、[PHP] 等编程语言。图1JetBrains开发工具PyCharm下载和安装进入 PyCharm官方下载页面(如图2所示),可以看

    2022年8月26日
    8
  • C语言链表详解(通俗易懂,超详细)

    C语言链表详解(通俗易懂,超详细)前言 想要很好的学好链表 我们首先要了解链表的优缺点 面试 优点 1 插入删除不需移动其他元素 只需改变指针 2 链表各个节点在内存中空间不要求连续 空间利用率高缺点 1 访问数组元素效率低 2 数组的存储空间连续 内存空间利用率低 1 单链表通俗讲就是结构体变量与结构体变量链接在一起 链表结构体变量 一般由数据域 任何数据 和指针域组成 也就是所说的结点 结点组成 stru

    2026年3月16日
    2
  • redhat7.4配置本地yum源_centos7yum源的配置

    redhat7.4配置本地yum源_centos7yum源的配置1.定位到yum的配置文件[root@linuxprobe~]#cd/etc/yum.repos.d/2.查看是否有配置文件[root@linuxprobeyum.repos.d]#ls3.检查yum是否安装,以及安装了哪些依赖源并删除yum包[root@linuxprobeyum.repos.d]#rpm-qa|grepyum显示如下(根据各自情况,有可能不…

    2022年8月13日
    4
  • gcc中include文件的搜索路径

    gcc中include文件的搜索路径

    2022年3月12日
    93

发表回复

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

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