【问题标题】:StackOverflowError in java - Recursionjava中的StackOverflowError - 递归
【发布时间】:2016-01-07 11:32:36
【问题描述】:

我是 java 新手,我想了解当我在类和主程序中创建对象时,我在执行时遇到此异常线程“main”java.lang.StackOverflowError 中的异常下面的程序。有人可以帮我理解为什么它会递归吗?

public class Test {

    Test t = new Test();

    public static void main(String arg[]) {

        Test t = new Test();
    }
}

【问题讨论】:

    标签: java constructor stack-overflow


    【解决方案1】:

    那里没有构造函数。我认为以下是您想要的:

    class Test {
      //constructor method
      Test() {
        System.out.println("Constructor method called.");
      }
    
      public static void main(String[] args) {
        Test t = new Test;  //creating object
      }
    }
    

    来源:http://www.programmingsimplified.com/java/tutorial/java-constructor-tutorial

    你得到堆栈溢出的原因是每次你的类被实例化时,它都会声明实例变量 t,它被初始化为该类的另一个新实例,这会导致无限递归,因为每个新对象都会创建另一个新对象等。

    【讨论】:

    • java中不声明构造函数也可以,编译器会包含默认构造函数。
    • 是的,我知道,但是输出一条消息来证明构造函数被调用似乎很有用,因为海报说他试图理解构造函数。
    • 我引用的那个来源可能不是一般 Java 教程的最佳选择。这个可能更好,虽然构造函数的例子不是那么简单:docs.oracle.com/javase/tutorial/java/javaOO/constructors.html
    【解决方案2】:

    这里的问题是变量t

    如果创建了新的Test-Object,t 将自动初始化 - 使用新的 Test-Object,在创建时再次创建新的 Test-Object。所以每次调用Test 的构造函数都会导致再次调用Test 的构造函数。直到堆栈溢出。

    【讨论】:

      【解决方案3】:

      因为您在测试类本身中声明 Test t = new Test(); 删除顶部的 Test t = new Test(); 或更改变量然后尝试运行它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-03
        • 2014-11-09
        • 2012-10-21
        • 1970-01-01
        • 2013-02-25
        • 1970-01-01
        • 1970-01-01
        • 2021-03-22
        相关资源
        最近更新 更多