java - 循环构造函数对象循环java

标签 java loops exception

首先它是一个堆栈溢出问题,我知道它已经溢出,因为创建了大量对象。 但问题是,我最初没有在引用中存储任何对象引用,所以当资源被使用且没有对象引用时,为什么垃圾收集器不转储。

其次 请参阅下面的那些异常当代码中没有任何文件处理时,为什么会出现那些 FileOutputStream.write() 异常?

class Base{
    Base(){
        Constructorloop c=new  Constructorloop();

    }
}

class Constructorloop{
    static int i=0;
    Constructorloop(){
        System.out.println(i+++" X 2 objects created");
        Base  b=new Base();
    }
    public static void main(String args[]){
        new Base();
    }
}

异常(exception)情况:

Exception in thread "main" java.lang.StackOverflowError
        at java.io.FileOutputStream.write(Unknown Source)
        at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
        at java.io.BufferedOutputStream.flush(Unknown Source)
        at java.io.PrintStream.write(Unknown Source)
        at sun.nio.cs.StreamEncoder.writeBytes(Unknown Source)
        at sun.nio.cs.StreamEncoder.implFlushBuffer(Unknown Source)
        at sun.nio.cs.StreamEncoder.flushBuffer(Unknown Source)
        at java.io.OutputStreamWriter.flushBuffer(Unknown Source)
        at java.io.PrintStream.write(Unknown Source)
        at java.io.PrintStream.print(Unknown Source)
        at java.io.PrintStream.println(Unknown Source)
        at Constructorloop.<init>(Constructorloop.java:11)
        at Base.<init>(Constructorloop.java:3)
        at Constructorloop.<init>(Constructorloop.java:12)
        at Base.<init>(Constructorloop.java:3)
        at Constructorloop.<init>(Constructorloop.java:12)

最佳答案

您部分正确地观察到堆栈溢出错误是由于您在循环中创建许多对象而导致的。至于垃圾收集器:它不会连续运行。而是等待一个合适的时机。您可能没有保存对您正在创建的对象的引用,但引用仍然放在堆栈中(尽管对象本身位于堆中)。而且,重复调用一个函数会在每次调用时在堆栈上放置一个返回引用,因此甚至可能不是对象创建导致堆栈溢出异常。

至于 FileOutputStream 中的异常:在无限循环中,System.out.println 被重复调用,它使用流作为输出。在内部,它将调用方法和调用其他方法,所有这些都添加到您的堆栈中,直到用完堆栈空间。

总而言之,无论您是否正在创建对象实例,函数调用自身的无限循环总是会耗尽堆栈空间。

关于java - 循环构造函数对象循环java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59471059/

相关文章:

java - 处理程序和调度程序之间的区别

java - swing:有没有办法让按钮/复选框只有在按下 SHIFT 或 CTRL 时才可单击?

java - 在 Java 的循环中使用 Thread.sleep() 定期做某事是否可以?

oracle - "Cursor is closed"错误 - 尝试使用 JDBC 执行 Oracle SP 时

php - Laravel 5 - 验证为假时出现 MethodNotAllowedHttpException

java - 如何管理用户输入字母而不是数字?

java - "variable referenced from inner class must be final "问题

java - Java中如何获取类的对象的引用值?

javascript - JavaScript 中的 while 循环永远运行

java - Java中在新行中打印数字的每个数字