在Java中获取StackOverFlowError

时间:2011-02-25 09:43:43

标签: java stack-overflow

这是我写的节目。我运行时遇到StackOverFlowError异常:

public class maininherit {

   maininherit h = new maininherit() {

        @Override
        public void mai() {
            System.out.print("inner");
        }
    };

    public static void main(String[] args){
       maininherit t=new maininherit();
       t.mai();
    }

    public void mai(){
       System.out.print("hellllll");
       h.mai();
    }
  }

只有在我使用StackOverflowError类作为内部类的引用时,才会获得maininherit。如果我正在使用其他类,我没有收到该错误。任何人都可以向我澄清这个吗?

抱歉,我感谢你的答案,但我怀疑我不知道是否合理或不重复只有当我在同一个类的构造函数中创建实例时才能重复初始化。那么它是如何可能的有多个初始化?

4 个答案:

答案 0 :(得分:9)

内部类的实现只是覆盖maininherit类的一部分。所以... 你初始化类maininherit然后变量 h 被初始化。 新的运算符被调用然后......内部类init maininherit再次需要设置h变量。

您的代码是初始化h变量的无限循环。

答案 1 :(得分:1)

此处的问题不在于您的mainmai函数,而在于maininherit h成员变量的初始化。问题是maininherit的每个实例都在创建一个maininherit对象(反过来会创建一个maininherit对象,等等)。将其标记为static成员将导致所有实例共享单个副本,这将解决此问题。

答案 2 :(得分:1)

这一行:

maininherit t=new maininherit();

创建一个新的maininherit对象(我称之为m0),它有一个相同类型的字段(我称之为m1

创建m0时,初始化m1。 m1也有一个字段,因此m2被初始化。 m2也有一个字段,所以m3初始化等。

如果StackOverflowError没有oocur

,这将永远持续下去

答案 3 :(得分:0)

每当您尝试创建与成员变量相同的类的实例时,都会发生Stackoverflow错误。所以h实例创建了无限次,因此出现了stackoverflow错误。

例如你给的代码,即使没有内部类,它也会抛出stackoverflow错误

public class maininherit {

maininherit h=new maininherit();


public static void main(String[] args){
   maininherit t=new maininherit();
   t.mai();
 }

public void mai(){
    System.out.print("hellllll");
    h.mai();
}}

避免将类本身的对象创建为成员或字段