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参数增加栈的大小,这个参数可以在项目配置或命令行指定。

java.lang.stackoverflowerror_java.lang.StackOverflowError——如何解决StackOverflowError错误相关推荐

  1. java webservice https_WebService的HTTPS访问——解决PKIX错误 | 字痕随行

    最近都在与Java打交道,将原来的项目用Java重构了一遍,所以之前的问题又再次浮出水面,在Axis2的WebService客户端生成完毕后,访问目标服务时报错,错误为"unable to ...

  2. java.lang.stackoverflowerror_java.lang.StackOverflowError解决

    在使用JPA的仓储repository进行查询时,经常用到findAllbyId的方法: repository.findAllbyId() 但如果像下面的代码,当list的size量太大的话,就会报栈 ...

  3. Maven 打包报“java.lang.StackOverflowError”错解决办法

    Maven 打包报"java.lang.StackOverflowError"错解决办法 1.在命令行执行 2.在IDEA集成开发工具中执行 1.在命令行执行 平台:windows ...

  4. java.lang.ArrayIndexOutOfBoundsException异常分析及解决

    2019独角兽企业重金招聘Python工程师标准>>> java.lang.ArrayIndexOutOfBoundsException异常分析及解决 这是一个非常常见的异常,从名字 ...

  5. 错误记录(二)java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I错误时的原因及解决办法

    在struts2和hibernate整合时出现java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I错误,一般是因为struts和h ...

  6. 已解决java.lang.Integer cannot be cast to java.lang.String异常的正确解决方法,亲测有效!!!

    已解决java.lang.Integer cannot be cast to java.lang.String异常的正确解决方法,亲测有效!!! 文章目录 报错问题 解决方法 福利 报错问题 1.在执 ...

  7. 已解决java.lang.ClassCastException异常的正确解决方法,亲测有效!!!

    已解决java.lang.ClassCastException异常的正确解决方法,亲测有效!!! 文章目录 报错问题 解决方法 福利 报错问题 粉丝群里面的一个小伙伴敲代码时发生了报错(当时他心里瞬间 ...

  8. 已解决java.lang.NoClassDefFoundError异常的正确解决方法,亲测有效!!!

    已解决java.lang.NoClassDefFoundError异常的正确解决方法,亲测有效!!! 文章目录 报错问题 报错原因 解决方法 NoClassDefFoundError解决示例 福利 报 ...

  9. 已解决java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Map异常的正确解决方法,亲测有效!!

    已解决java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Map异常的正确解决方法,亲测有效!! ...

最新文章

  1. 从URL中获取搜索关键字
  2. ppt式 html模板,html10使用模板统一页面风格.ppt
  3. linux内核管理pagecache的一丢丢知识整理
  4. Java中的功能性FizzBu​​zz Kata
  5. java反射用法示例_Java包| 类型,用法,示例
  6. 大数据?人工智能?揭秘银行数据仓库发展趋势
  7. 从零开始springboot 第二讲
  8. 浏览器显示html过程,浏览器显示页面的流程
  9. matlab2c使用c++实现matlab函数系列教程-ceil函数
  10. Python基础学习Day3 数据类型的转换、int、str、bool、字符串的常用方法、for循环...
  11. PHP自动售货发卡网源码,PHP自动售货发卡网源码 集成多种支付接口
  12. yylabel html富文本,YYLabel计算富文本高度-膜拜大神
  13. 提升体验:为游戏添加声色
  14. python判断excel某单元格是否为空
  15. SAP学习之北冥神功
  16. 第十六篇 晶体管之电流放大器
  17. 用Python写一个桌面便签(每日计划本)
  18. 浅谈C++ 之STL
  19. 有没有好看的俄剧推荐-如下表
  20. 美图类App原型制作分享-Meitu

热门文章

  1. Spring Batch作为Wildfly模块
  2. 创建Sonarqube项目
  3. 泽西岛的RESTful Web服务
  4. 创建委托登录模块(用于JBoss EAP 6.1)
  5. MOXy的对象图– XML和JSON的输入/输出局部模型
  6. 振作起来– Spring Framework 4.0即将来临!
  7. Wordcounter,使用Lambdas和Fork / Join计算Java中的单词数
  8. TeamCity工件:HTTP,Ant,Gradle和Maven
  9. 使用dbUnit,JSON,HSQLDB和JUnit规则进行数据库单元测试
  10. Eclipse:如何附加Java源代码