大家来谈谈java.lang.StackOverFlowError,以前没遇到过这个异常

CaptainGan 2011-08-25 11:02:28
在我的程序中有个线程时刻在运行(在这里可以将这个线程看成一个死循环)调用多个类中的方法,在今天修改代码以前未出现java.lang.StackOverFlowError异常,

大家来说说这个StackOverFlowError,因为我以前都为遇到过这个异常的,说明这个异常很少出现。

从网上的文章来看,这个异常很有可能是由于死循环在持续地调用类中的方法,导致堆栈溢出,很多的解决方法就是将代码结果进行优化,降低代码的层次结构,是代码的结构更为简单有效。

大家说说各自的建议,和解决方法,我随时在此等候学习。
...全文
2774 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
CaptainGan 2011-08-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 perfe_ct 的回复:]

简单来说就是你的线程调用方法数量太多 导致java.lang.StackOverFlowError异常
[/Quote]

其实我并不认为是由于线程调用方法太多,可以看2L,在线程中的方法最多不超过10个方法,这个能说很多嘛,我认为产生这个异常的关键的是由于在一个类Class1调用中的方法methodA()的方法Class2.method1()调用过后,又有另外一个类中的Class1.methodB()中又调用Class2.method1()引起的,并且Class1.methodA()方法又调用Class1.methodB()。

转换成代码就是:



class Class1{
Class2 class2 = new Class2();

public void methodA(){
String str = "A"
calss2.method1(str);
methodB();
}

public void methodB(){
String str = "B";
calss2.method1(str);
}
}

class Class2{
public void method1(String str){
System.out.println(str);
}
}

Class threadClass extends Thread{

public void run (){
while (true){
(new Class1()).methodA();
}
}
}

forestandriver23 2011-08-25
  • 打赏
  • 举报
回复
class A{
public void a(){
this.a();
}
}

没有控制返回条件的多次递归调用会引起这个问题。上面的代码就是例子。再就是两个线程互相调用彼此依赖的方法,形成间接递归调用。
楼主仔细查一查修改的那些代码有没有这种情况。
CaptainGan 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ticmy 的回复:]

理解java栈的工作方式就容易理解了
[/Quote]

能否说说?
CaptainGan 2011-08-25
  • 打赏
  • 举报
回复
由上面的结构可以看出,关键就是在InformationClass和LogFileCheckClass这两个类,在循环中出现相互的调用彼此的方法,这样造成了java.lang.StackOverFlowError异常。

不知道这样将是否合理。
CaptainGan 2011-08-25
  • 打赏
  • 举报
回复
我来说说,我在工程中可能找到了造成这个异常的原因,《由于代码属于公司机密,在此就不贴出代码了》。
=============================
在我工程中有几个关键的东西
1.线程 ThreadClass
2.关键类CoreClass
3.信息显示类InformationClass
4.文件操作类LogFileCheckClass
===============================
A.可能造成异常的原因. 我把关键的代码结构写出来
ThreadClass ->调用->
CoreClass.checkClass()->
checkClass调用->
InformationClass.showInfo(String info)->
showInfo(String info)调用->
LogFileCheckClass.fileCheck(arg0,arg1)调用->
LogFileCheckClass.logCheck(arg0,arg1)->
logCheck(arg0,arg1)调用->
InformationClass.showInfo(String info)。

整个流程在线程ThreadClass的控制下运行。
异常循环地出现在LogFileCheckClass.logCheck(arg0,arg1)方法中调用的InformationClass.showInfo(String info)处。

因此发现了这个规律,我将LogFileCheckClass.logCheck(arg0,arg1)方法中的所有的InformationClass.showInfo(String info)方法都去掉。去掉后,这个异常就没有产生了。

不知道讲清楚了没?
龙四 2011-08-25
  • 打赏
  • 举报
回复
理解java栈的工作方式就容易理解了
perfe_ct 2011-08-25
  • 打赏
  • 举报
回复
简单来说就是你的线程调用方法数量太多 导致java.lang.StackOverFlowError异常
疯狂的驴子 2011-08-25
  • 打赏
  • 举报
回复
来凑热闹,学习学习!!
luohuijun619 2011-08-25
  • 打赏
  • 举报
回复
StackOverFlowError堆栈溢出,一般是死循环,递归造成

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧