如何避免Java equals方法的空指針異常

小樊
97
2024-09-06 23:01:38

為了避免在 Java 中的 equals 方法中出現(xiàn)空指針異常(NullPointerException),你可以采取以下策略:

  1. 使用 Objects.equals() 方法: 從 Java 7 開始,java.util.Objects 類提供了一個(gè)靜態(tài)方法 equals(),它可以幫助你避免空指針異常。這個(gè)方法會(huì)在比較之前檢查兩個(gè)參數(shù)是否為 null。

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        MyClass myClass = (MyClass) obj;
        return Objects.equals(field1, myClass.field1) &&
               Objects.equals(field2, myClass.field2);
    }
    
  2. 使用 Apache Commons Lang3: Apache Commons Lang3 庫(kù)提供了一個(gè)名為 EqualsBuilder 的類,它可以幫助你編寫不拋出空指針異常的 equals 方法。

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        MyClass myClass = (MyClass) obj;
        return new EqualsBuilder()
                .append(field1, myClass.field1)
                .append(field2, myClass.field2)
                .isEquals();
    }
    
  3. 顯式檢查 null 值: 在比較字段之前,顯式地檢查它們是否為 null。

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        MyClass myClass = (MyClass) obj;
        
        if (field1 != null ? !field1.equals(myClass.field1) : myClass.field1 != null) return false;
        if (field2 != null ? !field2.equals(myClass.field2) : myClass.field2 != null) return false;
        
        return true;
    }
    
  4. 使用 Java 14 中的 record 類型: 如果你正在使用 Java 14 或更高版本,可以考慮使用新引入的 record 類型。record 類型自動(dòng)為你生成一個(gè)不會(huì)拋出空指針異常的 equalshashCode 方法。

    public record MyClass(String field1, String field2) {}
    

通過采用上述策略,你可以確保 equals 方法不會(huì)因?yàn)榭罩羔槷惓6鴮?dǎo)致程序崩潰。

0