在C ++中,对象的生命周期在构造函数成功完成时开始。在构造函数内部,该对象尚不存在。
问:从构造函数中发出异常是什么意思?
答:这意味着建筑已经失败,对象从未存在过,它的生命从未开始。 [source]
我的问题是:Java也是如此吗?例如,如果我将this
移交给另一个对象,然后我的构造函数失败了会发生什么?
Foo()
{
Bar.remember(this);
throw new IllegalStateException();
}
这个定义明确吗? Bar
现在是否有对非对象的引用?
答案 0 :(得分:8)
该对象存在,但尚未正确初始化。
只要this
在构造期间泄漏(而不仅仅是在抛出异常时),就会发生这种情况。
这是一个非常有问题的情况,因为在这种情况下,一些通常假定的保证不成立(例如final
字段似乎在构造期间改变了它们的值。
因此,您绝对应该避免在构造函数中泄漏this
。
This IBM developerWorks article描述了构建对象时要采取的预防措施以及这些预防措施背后的原因。虽然本文根据多线程讨论了这个主题,但是当未知/不可信代码在构造期间引用this
时,您可以在单线程环境中遇到类似的问题。
答案 1 :(得分:1)
您永远不应该在构造函数中打开文件编写器之类的资源。创建一个init方法,然后从那里开始。那你就安全了。
答案 2 :(得分:0)
此代码不是异常安全的,在C ++中也不是异常安全的。无论您使用哪种语言,都是同样的错误。