在我的程序中有个线程时刻在运行(在这里可以将这个线程看成一个死循环)调用多个类中的方法,在今天修改代码以前未出现java.lang.StackOverFlowError异常,大家来说说这个StackOverFlowError,因为我以前都为遇到过这个异常的,说明这个异常很少出现。从网上的文章来看,这个异常很有可能是由于死循环在持续地调用类中的方法,导致堆栈溢出,很多的解决方法就是将代码结果进行优化,降低代码的层次结构,是代码的结构更为简单有效。大家说说各自的建议,和解决方法,我随时在此等候学习。

解决方案 »

  1.   

    理解java栈的工作方式就容易理解了
      

  2.   

    我来说说,我在工程中可能找到了造成这个异常的原因,《由于代码属于公司机密,在此就不贴出代码了》。
    =============================
    在我工程中有几个关键的东西
    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)方法都去掉。去掉后,这个异常就没有产生了。不知道讲清楚了没?
      

  3.   

    由上面的结构可以看出,关键就是在InformationClass和LogFileCheckClass这两个类,在循环中出现相互的调用彼此的方法,这样造成了java.lang.StackOverFlowError异常。不知道这样将是否合理。
      

  4.   

    class A{
       public void a(){
              this.a();
    }
    }没有控制返回条件的多次递归调用会引起这个问题。上面的代码就是例子。再就是两个线程互相调用彼此依赖的方法,形成间接递归调用。
    楼主仔细查一查修改的那些代码有没有这种情况。
      

  5.   

    StackOverFlowError堆栈溢出,一般是死循环,递归造成
      

  6.   

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

  7.   


    其实我并不认为是由于线程调用方法太多,可以看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();
       }
      }
    }