在我的程序中有个线程时刻在运行(在这里可以将这个线程看成一个死循环)调用多个类中的方法,在今天修改代码以前未出现java.lang.StackOverFlowError异常,大家来说说这个StackOverFlowError,因为我以前都为遇到过这个异常的,说明这个异常很少出现。从网上的文章来看,这个异常很有可能是由于死循环在持续地调用类中的方法,导致堆栈溢出,很多的解决方法就是将代码结果进行优化,降低代码的层次结构,是代码的结构更为简单有效。大家说说各自的建议,和解决方法,我随时在此等候学习。
=============================
在我工程中有几个关键的东西
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)方法都去掉。去掉后,这个异常就没有产生了。不知道讲清楚了没?
public void a(){
this.a();
}
}没有控制返回条件的多次递归调用会引起这个问题。上面的代码就是例子。再就是两个线程互相调用彼此依赖的方法,形成间接递归调用。
楼主仔细查一查修改的那些代码有没有这种情况。
其实我并不认为是由于线程调用方法太多,可以看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();
}
}
}