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