Java 当构造函数在引发异常之前部分成功时会发生什么?

Java 当构造函数在引发异常之前部分成功时会发生什么?,java,exception,constructor,Java,Exception,Constructor,假设我有以下基类: public class RootClass { private List<RootClass> children = new ArrayList<RootClass>(); public RootClass(RootClass parent) { if (parent != null) { parent.addChild(this); } } public void addChild(RootClas

假设我有以下基类:

public class RootClass {

  private List<RootClass> children = new ArrayList<RootClass>();

  public RootClass(RootClass parent) {
    if (parent != null) {
      parent.addChild(this);
    }
  }

  public void addChild(RootClass child) {
    children.add(child);
  }

}
现在,假设我创建了一个
ChildClass
实例,该实例抛出异常,但在构造函数之外被捕获(在代码深处的某个地方,到目前为止,它不知道
ChildClass
尚未完全构造)。现在,父级在其
子级
列表中有一个对
子类
的引用,该类尚未运行其构造函数

这些情况应如何处理?这只是一个糟糕的设计方案吗?或者这一点意义都没有?我真的不想重构整个应用程序,在构造函数完成后将子应用程序添加到父应用程序中。

如果:

 private List<RootClass> children = new ArrayList<RootClass>();
private List children=new ArrayList();
如果是一个静态字段,您只会将一个半初始化的对象泄漏到野外。事实并非如此,这不会有任何区别


只有当这个引用泄漏到对象之外的某个地方时,您才会有问题,然后您就会有一个半初始化的对象等待在您的系统上引起问题。只要您确保引用本身不出任何地方,一切都是好的。

作为一般原则,要不惜一切代价避免将“this”的值泄露给构造函数。在这种情况下,父对象将具有对半构造对象的引用。它应该在调用者中编码为parent.addChild(new Child()),而不是自动添加。

可能重复“可能”重复的含义是什么?这类问题需要更多VoteNo,他泄漏了它,因为父级是合法的且已经存在的实例,现在有一个关于孩子们的参考。我想知道这个模式是否有有效的用法。或者更确切地说,java允许编译这种代码是有原因的吗?@Pacerier编译器的存在不是为了防止您编写不安全的代码,只是为了防止您编写+不正确的+代码。如果没有这种代码的有效用例,它也可能被认为是“不正确的”@Pacerier没有人说没有有效的用例。您仍然在混淆编译器的功能和语言规范。@Pacier一次可能会混淆不止一件事:-|
 private List<RootClass> children = new ArrayList<RootClass>();