[英]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.