【问题标题】:how to resolve StackOverFlowError?如何解决 StackOverFlowError?
【发布时间】:2013-11-15 08:45:22
【问题描述】:

我的内部和外部类文件在这里:-

package com.demo;

public class Outer {
int outer_x=100;

void test(){
    Inner inner =new Inner();
    inner.display();
}
public class Inner {
void display(){
    Outer ob=new Outer();
    ob.test();

    System.out.println("display: outer_x= "+outer_x);
}
}

}

另一个主类访问外部类成员:-

package com.demo;

class InnerClassDemo{
    public static void main(String args[]){
        Outer outer=new Outer();
        outer.test();
    }
}

例外:-

Exception in thread "main" java.lang.StackOverflowError
    at com.demo.Outer.<init>(Outer.java:3)
    at com.demo.Outer$Inner.display(Outer.java:12)
    at com.demo.Outer.test(Outer.java:8)

如何解决这个问题,请给我任何想法?

【问题讨论】:

  • test() 方法中跟踪您的执行。
  • test() 方法中的哪种错误我访问了内部类方法
  • 外层 --> 内层 --> 外层 --> 内层 --> 外层 --> 内层 --> ........ StackOverFlowException
  • 我仍然喜欢这个网站上有关 StackOverflows 的问题 :)
  • 可以请人编辑我的代码为什么会出现这个错误

标签: java class exception package outer-join


【解决方案1】:

您的test 方法创建一个Inner 并调用其display() 方法,该方法创建一个Outer 并调用其test 方法。您的代码中没有任何内容可以阻止这种情况永远持续下去,直到调用了足够的方法来填满堆栈空间并出现 StackOverflowError

要么没有test 调用display,要么没有display 调用test

【讨论】:

    【解决方案2】:

    我从@rgettman 解决了这个问题,答案在这里修改了我的内部和外部类

    package com.demo;
    public class Outer {
    int outer_x=100;
    
    void test(){
        Inner inner =new Inner();
        inner.display();
    }
    public class Inner {
    void display(){
    
        System.out.println("display: outer_x= "+outer_x);
    }
    }
    
    }
    

    【讨论】:

    • 仅供参考 - 这应该是对您的问题的编辑,而不是答案。
    • 感谢@Okuma.Scott 提供新建议
    【解决方案3】:

    Outer.test 调用 Inner.display 调用 Outer.test 调用 Inner.display 调用 Outer.test 调用 Inner.display ...

    这种情况一直持续到您的程序用完堆栈空间为止。

    【讨论】:

      【解决方案4】:

      你得到 StackOverFlowError,因为你的调用有一个无限的方法调用,它总是超出程序堆栈。

      您的测试方法调用 display 和 display 方法调用 testunconditionaly。

      为递归方法定义一个基本情况是基本要求,因此您应该定义一个返回和停止递归方法调用的基本情况。

      另请参阅

      Recursion

      【讨论】:

      • 它不是递归@erencan
      • 您还可以递归地创建实例并且只调用一次它的方法。最后,是的,它是递归。
      猜你喜欢
      • 2019-12-05
      • 1970-01-01
      • 2019-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-16
      • 1970-01-01
      相关资源
      最近更新 更多