gpt4 book ai didi

java - 在构造函数中使用 'this' 而不抛出 NullPointerException

转载 作者:行者123 更新时间:2023-12-02 05:02:33 26 4
gpt4 key购买 nike

我想创建一个类Bar这样每次我实例化 Bar ,它被添加到 ArrayList<Bar>对象的 Foo 。这是我尝试过的:

class Foo {
private ArrayList<Bar> bars;
.
.
.
public ArrayList<Bar> getBars() { return bars; }
}

//in class Bar
class Bar {
public Bar(Foo f) {
f.getBars().add(this); //NullPointerException!
}
}

我意识到这里发生了什么(构造函数尚未完成,因此 this 返回 null ),但如何避免这种情况?

最佳答案

I realize what is happening here (the constructor is not finished, so this returns null), but how can I avoid this?

您的诊断不正确。

this 的值永远不能为 null。这包括在构造函数中。

JLS ( 15.8.3 ) 声明如下:

"The keyword this may be used only in the body of an instance method or default method, or in the body of a constructor of a class, or in an instance initializer of a class, or in the initializer of an instance variable of a class. If it appears anywhere else, a compile-time error occurs."

"When used as a primary expression, the keyword this denotes a value that is a reference to the object for which the instance method or default method was invoked (§15.12), or to the object being constructed."

如您所见:

  1. this 关键字只能出现在存在当前对象的上下文中,并且

  2. this 的值(用作表达式时)始终是对当前对象的引用;没有提及任何可能为 null 的情况。

(另请参阅:Can "this" ever be null in Java?)

<小时/>

此时 this 引用的对象尚未完全初始化,但这并不是您所看到的异常的原因。 NPE 的原因是另外的。

具体来说,如果在该行抛出 NPE,则 fnull f.getBars() 返回 null。看看您如何编码 Foo 类,后者绝对是合理的。 (您没有初始化 bars 成员...因此它将为 null。)

关于java - 在构造函数中使用 'this' 而不抛出 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28121484/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com