Java 构造函数中的异常 在C++中,当构造函数成功完成时,对象的生命周期开始。在构造函数中,对象还不存在
问:从构造函数发出异常意味着什么 答:这意味着建造失败了,这个物体根本不存在,它的寿命也从未开始过。[] 我的问题是:Java也是如此吗?例如,如果我将Java 构造函数中的异常 在C++中,当构造函数成功完成时,对象的生命周期开始。在构造函数中,对象还不存在,java,exception,constructor,Java,Exception,Constructor,问:从构造函数发出异常意味着什么 答:这意味着建造失败了,这个物体根本不存在,它的寿命也从未开始过。[] 我的问题是:Java也是如此吗?例如,如果我将这个交给另一个对象,然后我的构造函数失败,会发生什么 Foo() { Bar.remember(this); throw new IllegalStateException(); } 这个定义明确吗?Bar现在是否有对非对象的引用?该对象存在,但未正确初始化 无论何时此在构造过程中泄漏(不仅仅是在抛出异常时),都可能发生这种情况
这个交给另一个对象,然后我的构造函数失败,会发生什么
Foo()
{
Bar.remember(this);
throw new IllegalStateException();
}
这个定义明确吗?Bar
现在是否有对非对象的引用?该对象存在,但未正确初始化
无论何时此
在构造过程中泄漏(不仅仅是在抛出异常时),都可能发生这种情况
这是一个非常有问题的情况,因为一些通常假设的保证在这种情况下不成立(例如,final
字段似乎在构造过程中改变了它们的值)
因此,您一定要避免在构造函数中泄漏此
描述构造对象时要采取的预防措施以及这些预防措施背后的原因。虽然本文从多线程的角度讨论了这个主题,但在单线程环境中,当未知/不受信任的代码在构造过程中引用了此
时,您可能会遇到类似的问题。您不应该像构造函数中的文件编写器那样打开资源。改为创建一个init方法并从那里开始。那你就安全了 > P>此代码不例外,在C++中也不会例外。无论您使用哪种语言,它都是相同的bug。+1-但在这种情况下,“泄漏”称为(不安全的)“发布”;e、 在布洛赫。此外,最好能更深入地解释这一点,“这样你就安全了”。那句话显然是假的!!在构造函数中还有很多其他的事情会导致异常;e、 非法参数、NPE、数组索引等,甚至堆栈溢出或内存不足错误。这是很好的建议,但在其他情况下,您可能希望构造函数失败。例如,我想要一个这里描述的并行迭代器,所以我想检查列表在构建时的大小是否相同。