【问题标题】:java StackOverflowError when local and instance objects creation本地和实例对象创建时的java StackOverflowError
【发布时间】:2011-04-10 10:32:31
【问题描述】:

嗨,谁能解释一下为什么这段代码 sn-p 给了我 StackOverflowError 如果您能解释 instanceObj 初始化和调用 ObjectTest 构造函数和 java.lang.Object 构造函数时发生了什么,我真的很感激。在我看来,ObjectTest 构造函数一遍又一遍地循环。但我不知道确切的原因?所以有什么建议...


public class ObjectTest {

  public ObjectTest() {

   }


  ObjectTest instanceObj = new ObjectTest();


  public static void main(String[] args) {

     ObjectTest localObj = new ObjectTest();
   }
}

【问题讨论】:

标签: java object stack-overflow instance local


【解决方案1】:

您调用构造函数来创建对象的新实例。它具有对另一个实例的引用,您使用另一个新的 ObjectType 实例对其进行初始化,而后者又执行相同的操作。在你得到那个错误之前,它是无数次调用。

这会起作用。

public class ObjectTest { 

  public ObjectTest() { 

   } 


  public static void main(String[] args) { 

     ObjectTest localObj = new ObjectTest(); 
   } 
} 

【讨论】:

    【解决方案2】:

    让我们看看会执行什么:

    1. main() 创建ObjectTest 的新实例
    2. ObjectTest 类有一个字段instanceObj,其中将包含一个ObjectTest
    3. instanceObj 用新的ObjectTest 初始化
    4. 转到第 2 步

    我想你想要更多这样的东西:

    public class ObjectTest {
        private static ObjectTest instanceObj;
    
        private ObjectTest() {
        }
    
        public static ObjectTest getInstance() {
            if (instanceObj != null) {
                instanceObj = new ObjectTest();
            }
            return instanceObj;
        }
    
        public static void main(String[] args) {
    
            ObjectTest localObj = ObjectTest.getInstance();
        }
    }
    

    或者这个:

    public class ObjectTest {
        private static final ObjectTest instanceObj = new ObjectTest();
    
        private ObjectTest() {
        }
    
        public static ObjectTest getInstance() {
            return instanceObj;
        }
    
        public static void main(String[] args) {
    
            ObjectTest localObj = ObjectTest.getInstance();
        }
    }
    

    这是单例模式。


    关于同一主题:

    【讨论】:

      【解决方案3】:

      每个ObjectTest 实例都指向另一个 ObjectTest——命名为instanceObj。这个实例是在它的“父”实例被创建时构建的……因此导致另一个无限的构建。

      以下是可以更清楚地指出缺陷的等效代码:

      public class ObjectTest {
      
        ObjectTest instanceObj;
      
        public ObjectTest() {
          instanceObj = new ObjectTest(); /* Recursively call the constructor. */
        }
      
      }
      

      【讨论】:

        【解决方案4】:

        因为你在递归地创建自己。

        您需要注入您的实例,或让其他类管理该属性。

        public class ObjectTest {
        
         public ObjectTest() {
            instanceObj  = null;
         }
         public ObjectTest(ObjectTest myObjectTest) {
             instanceObj = myObjectTest;
         }
        }
        

        【讨论】:

        • Java 规范的哪一部分解释了这一点?
        猜你喜欢
        • 2012-07-27
        • 1970-01-01
        • 2013-12-15
        • 1970-01-01
        • 1970-01-01
        • 2018-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多