Java 抛出新异常()时创建的对象

Java 抛出新异常()时创建的对象,java,object,exception,Java,Object,Exception,我有一节课 public class TestDog { public static void main(String[] args) { Dog d1 = new Dog(); Dog d2 = new Dog(); Dog d3 = d2; //how many objects created ? at this line. } } 和一个测试类: public class Dog { public D

我有一节课

public class TestDog {
    public static void main(String[] args) {
        Dog d1 = new Dog();
        Dog d2 = new Dog();
        Dog d3 = d2;
        //how many objects created ? at this line.
    }
}
和一个测试类:

public class Dog {
    public Dog() {
        try{
            throw new Exception() ;
        } catch( Exception e) {}
    }
}

我怀疑在整个过程中创建了多少对象?请澄清。

您是正确的,只创建了两个对象。将引用指定给其他引用不会创建新对象。此外,这里还有一些额外的要点:

尽管在构造函数中创建了一个新的异常对象,但它是一个本地对象,不会传播回调用方,因此,它有资格进行垃圾收集,或者在分配d2时可能已经进行垃圾收集,这取决于构造函数完成后垃圾回收器立即运行的时间。 如果将异常对象指定给Dog类中的任何引用,则“是”,将创建另外两个异常对象并使其处于活动状态。
从您的代码中,我们看到我们抛出异常,但捕获它并处理-捕获后不执行任何操作


我们将创建2个Dog对象-按new。

我需要知道Dog d2分配给d3后创建了多少个对象,为什么您认为在这之后会创建任何对象?因为构造函数中会抛出新异常;是什么让你相信它会在狗d2被分配到d3后被创建?你应该阅读Peter Lawrey的博客文章,其中提到了这些愚蠢的问题。狗d2被分配到d3后?是的,会有3个参考,但只有2个对象。我需要一个确认,“如果抛出新异常,是否会在堆内存中创建新对象。@JangbahadurPatel是的,它会。但一旦构造函数完成,它将立即被销毁。如果是,那么应该创建4个对象?在末尾。加上2个异常对象。它们超出范围,将在某个时间点由GC收集。但它们是被创造出来的。