构造函数中的异常

fre*_*low 7 java constructor exception

在C++中,对象的生命周期在构造函数成功完成时开始.在构造函数内部,该对象尚不存在.

问:从构造函数中发出异常是什么意思?

答:这意味着建筑已经失败,对象从未存在过,它的生命从未开始.[ 来源 ]

我的问题是:Java也是如此吗?例如,如果我this交给另一个对象,然后我的构造函数失败了会发生什么?

Foo()
{
    Bar.remember(this);
    throw new IllegalStateException();
}
Run Code Online (Sandbox Code Playgroud)

这个定义明确吗?请问Bar现在有一个非对象的引用?

Joa*_*uer 8

该对象存在,但尚未正确初始化.

这种情况可能this在施工期间发生泄漏时发生(不仅仅是在抛出异常时).

这是一个非常有问题的情况,因为在这种情况下,一些通常假定的保证不成立(例如,final在施工期间,字段似乎会改变它们的值).

因此,您绝对应该避免this在构造函数中泄漏.

这篇IBM developerWorks文章描述了构造对象时要采取的预防措施以及这些预防措施背后的原因.虽然本文根据多线程讨论了这个主题,但是当未知/不可信代码this在构造期间获得引用时,您可以在单线程环境中遇到类似的问题.