java.lang.stackoverflowerror_java.lang.StackOverflowError——如何解决StackOverflowError错误
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错误相关推荐
- java webservice https_WebService的HTTPS访问——解决PKIX错误 | 字痕随行
最近都在与Java打交道,将原来的项目用Java重构了一遍,所以之前的问题又再次浮出水面,在Axis2的WebService客户端生成完毕后,访问目标服务时报错,错误为"unable to ...
- java.lang.stackoverflowerror_java.lang.StackOverflowError解决
在使用JPA的仓储repository进行查询时,经常用到findAllbyId的方法: repository.findAllbyId() 但如果像下面的代码,当list的size量太大的话,就会报栈 ...
- Maven 打包报“java.lang.StackOverflowError”错解决办法
Maven 打包报"java.lang.StackOverflowError"错解决办法 1.在命令行执行 2.在IDEA集成开发工具中执行 1.在命令行执行 平台:windows ...
- java.lang.ArrayIndexOutOfBoundsException异常分析及解决
2019独角兽企业重金招聘Python工程师标准>>> java.lang.ArrayIndexOutOfBoundsException异常分析及解决 这是一个非常常见的异常,从名字 ...
- 错误记录(二)java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I错误时的原因及解决办法
在struts2和hibernate整合时出现java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I错误,一般是因为struts和h ...
- 已解决java.lang.Integer cannot be cast to java.lang.String异常的正确解决方法,亲测有效!!!
已解决java.lang.Integer cannot be cast to java.lang.String异常的正确解决方法,亲测有效!!! 文章目录 报错问题 解决方法 福利 报错问题 1.在执 ...
- 已解决java.lang.ClassCastException异常的正确解决方法,亲测有效!!!
已解决java.lang.ClassCastException异常的正确解决方法,亲测有效!!! 文章目录 报错问题 解决方法 福利 报错问题 粉丝群里面的一个小伙伴敲代码时发生了报错(当时他心里瞬间 ...
- 已解决java.lang.NoClassDefFoundError异常的正确解决方法,亲测有效!!!
已解决java.lang.NoClassDefFoundError异常的正确解决方法,亲测有效!!! 文章目录 报错问题 报错原因 解决方法 NoClassDefFoundError解决示例 福利 报 ...
- 已解决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异常的正确解决方法,亲测有效!! ...
最新文章
- 从URL中获取搜索关键字
- ppt式 html模板,html10使用模板统一页面风格.ppt
- linux内核管理pagecache的一丢丢知识整理
- Java中的功能性FizzBu​​zz Kata
- java反射用法示例_Java包| 类型,用法,示例
- 大数据?人工智能?揭秘银行数据仓库发展趋势
- 从零开始springboot 第二讲
- 浏览器显示html过程,浏览器显示页面的流程
- matlab2c使用c++实现matlab函数系列教程-ceil函数
- Python基础学习Day3 数据类型的转换、int、str、bool、字符串的常用方法、for循环...
- PHP自动售货发卡网源码,PHP自动售货发卡网源码 集成多种支付接口
- yylabel html富文本,YYLabel计算富文本高度-膜拜大神
- 提升体验:为游戏添加声色
- python判断excel某单元格是否为空
- SAP学习之北冥神功
- 第十六篇 晶体管之电流放大器
- 用Python写一个桌面便签(每日计划本)
- 浅谈C++ 之STL
- 有没有好看的俄剧推荐-如下表
- 美图类App原型制作分享-Meitu
热门文章
- Spring Batch作为Wildfly模块
- 创建Sonarqube项目
- 泽西岛的RESTful Web服务
- 创建委托登录模块(用于JBoss EAP 6.1)
- MOXy的对象图– XML和JSON的输入/输出局部模型
- 振作起来– Spring Framework 4.0即将来临!
- Wordcounter,使用Lambdas和Fork / Join计算Java中的单词数
- TeamCity工件:HTTP,Ant,Gradle和Maven
- 使用dbUnit,JSON,HSQLDB和JUnit规则进行数据库单元测试
- Eclipse:如何附加Java源代码