簡體   English   中英

為什么在以下Java Stream過濾器方法中未引發NullPointerException

[英]Why NullPointerException is not thrown in the following Java Stream filter method

Blankie的第二個對象的顏色值為null,當它通過流管道時,它在null上檢查equals(),但令人驚訝的是未拋出NullPointerException。 為什么會這樣呢?

包裝神話

import java.util.stream.Stream;

class Blankie {
    String color = null;

    boolean isPink() {
        return "pink".equals(color);
    }
}

public class PreSchool {
    public static void main(String[] args) {
        Blankie b1 = new Blankie();
        Blankie b2 = new Blankie();
        b1.color = "pink";
        // String a1 = null;
        // System.out.println(a1.equals("ad"));
        Stream.of(b1, b2).peek(a -> {
            System.out.print(a.color);
        }).filter(Blankie::isPink).forEach(System.out::println);
    }
}

沒有理由會拋出NullPointerException Stringequals()方法將接受參數null並返回false 對於兩個字符串值s1s2 ,表達式s1.equals(s2)僅在s1null拋出NullPointerException 在您的代碼中, s1是字符串常量"pink"

something.equals(null)只是false

看一下java.lang.String#equals實現:

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {   // null is NOT instance of String 
        ...
    }
    return false;
}

如果您這樣做:

color.equals("pink");

它將拋出一個NPE。

“ pink”是一個字符串

"pink".equals(color); 

是相同的

"pink".equals(null);

如果要避免使用NPE,最好執行A.equals(B)並始終選擇A對象作為您知道其不為null的對象 ,例如ConstantEnum

當訪問屬性或在Null引用上調用方法時,將拋出NPE,這是由JVM而非代碼完成的。 對於參數方法為Null時會拋出NPE的某些方法,我已經看到了一些實現的實例,但那是錯誤的實現,在這種情況下,IllegalArgumentException更有意義。

如果使用String equals方法,請執行以下操作:

  1. 檢查兩個引用是否相同

  2. 檢查傳遞的參數是否為String類型:

    一種。 從兩個字符串中獲取char數組,並從左到右一一比較每個字符。 如果一切順利,則返回true

  3. 否則返回假

因此,重點是代碼不應拋出NPE,它們會使實現更容易出錯。 有很多更好的方法可以做到這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM