繁体   English   中英

我可以给一个这样的默认值来避免 null 指针异常吗?

[英]Can I give a default value like this to avoid null pointer exception?

我可以给变量这样的默认值吗?

public class Laptop {
    // initializing variable to avoid null pointer exception?
    private String owner = "";

    public Laptop(String owner) {
        this.owner = owner;
    }

    public String getOwner() {
        return owner;
    }

    public void setOwner(String owner) {
        this.owner = owner;
    }
}
private String owner = "";

这样做是多余的,因为它总是在构造函数中被覆盖。 构造函数实际上是这样的:

public Laptop(String owner) {
    super();
    this.owner = "";
    this.owner = owner;
}

显然,第一个任务会立即被踩踏,所以这样做没有意义。 删除字段上的初始化程序。

如果您希望能够创建没有所有者的Laptop ,您可以通过重载构造函数来提供默认值:

public Laptop() {
  this("");
}

public Laptop(String owner) {
    this.owner = owner;
}

现在你可以像这样调用:

Laptop owned = new Laptop("me"); // Will use the explicitly-provided owner "me".
Laptop unowned = new Laptop();   // Will use the default "".

如果您不想让owner成为 null (我想您稍后会担心,当您使用getOwner()的结果时),请在您分配owner的任何位置添加 null 检查:

this.owner = Objects.requireNonNull(owner);

这将在分配时出现NPE失败,但如果您从不想要null值字段,那么这是一个失败的好地方:您可以确切地看到null的来源,并修复它。

您可以执行Andreas 在评论中建议的操作:

this.owner = (owner != null ? owner : "");

但我建议不要这样做:如果您希望owner成为"" ,那么这就是您应该传递给构造函数的值; 传入null ,如果这不是允许的值,则应该通过抛出异常来明确不正确。 传入一个值并将其强制转换为其他值会让人感到惊讶。

您期望在哪里出现NullPointerException 无论您是否使用空字符串初始化属性owner ,示例中的任何代码都不会导致 NPE。

当您调用new Laptop(null)Laptop.setOwner(null)时,属性值将被覆盖,无论它之前具有哪个值。


但是,是的,一般来说,在适当的情况下,这种初始化可以用来防止 NPE。 您的代码没有提供这些情况……

您所做的很好,但为了保证getOwner()永远不会返回null您需要保护您的 set 方法,例如:

public void setOwner(String owner) {
    this.owner = owner != null ? owner : "";
}

另一方面,如果设置null应被视为异常,因为设置此属性被视为违反您的工作流程:

public void setOwner(String owner) {
    if (owner == null) {
       throw new IllegalArgumentException("Unexpected owner found.");
    }
    this.owner = owner;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM