Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 构造函数中的异常 在C++中,当构造函数成功完成时,对象的生命周期开始。在构造函数中,对象还不存在_Java_Exception_Constructor - Fatal编程技术网

Java 构造函数中的异常 在C++中,当构造函数成功完成时,对象的生命周期开始。在构造函数中,对象还不存在

Java 构造函数中的异常 在C++中,当构造函数成功完成时,对象的生命周期开始。在构造函数中,对象还不存在,java,exception,constructor,Java,Exception,Constructor,问:从构造函数发出异常意味着什么 答:这意味着建造失败了,这个物体根本不存在,它的寿命也从未开始过。[] 我的问题是:Java也是如此吗?例如,如果我将这个交给另一个对象,然后我的构造函数失败,会发生什么 Foo() { Bar.remember(this); throw new IllegalStateException(); } 这个定义明确吗?Bar现在是否有对非对象的引用?该对象存在,但未正确初始化 无论何时此在构造过程中泄漏(不仅仅是在抛出异常时),都可能发生这种情况

问:从构造函数发出异常意味着什么

答:这意味着建造失败了,这个物体根本不存在,它的寿命也从未开始过。[]

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

Foo()
{
    Bar.remember(this);
    throw new IllegalStateException();
}

这个定义明确吗?
Bar
现在是否有对非对象的引用?

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

无论何时
在构造过程中泄漏(不仅仅是在抛出异常时),都可能发生这种情况

这是一个非常有问题的情况,因为一些通常假设的保证在这种情况下不成立(例如,
final
字段似乎在构造过程中改变了它们的值)

因此,您一定要避免在构造函数中泄漏此


描述构造对象时要采取的预防措施以及这些预防措施背后的原因。虽然本文从多线程的角度讨论了这个主题,但在单线程环境中,当未知/不受信任的代码在构造过程中引用了此
时,您可能会遇到类似的问题。

您不应该像构造函数中的文件编写器那样打开资源。改为创建一个init方法并从那里开始。那你就安全了

> P>此代码不例外,在C++中也不会例外。无论您使用哪种语言,它都是相同的bug。

+1-但在这种情况下,“泄漏”称为(不安全的)“发布”;e、 在布洛赫。此外,最好能更深入地解释这一点,“这样你就安全了”。那句话显然是假的!!在构造函数中还有很多其他的事情会导致异常;e、 非法参数、NPE、数组索引等,甚至堆栈溢出或内存不足错误。这是很好的建议,但在其他情况下,您可能希望构造函数失败。例如,我想要一个这里描述的并行迭代器,所以我想检查列表在构建时的大小是否相同。