簡體   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