[英]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
。 String
的equals()
方法將接受參數null
並返回false
。 對於兩個字符串值s1
和s2
,表達式s1.equals(s2)
僅在s1
為null
拋出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的對象 ,例如Constant或Enum 。
當訪問屬性或在Null引用上調用方法時,將拋出NPE,這是由JVM而非代碼完成的。 對於參數方法為Null時會拋出NPE的某些方法,我已經看到了一些實現的實例,但那是錯誤的實現,在這種情況下,IllegalArgumentException更有意義。
如果使用String equals方法,請執行以下操作:
檢查兩個引用是否相同
檢查傳遞的參數是否為String類型:
一種。 從兩個字符串中獲取char數組,並從左到右一一比較每個字符。 如果一切順利,則返回true
否則返回假
因此,重點是代碼不應拋出NPE,它們會使實現更容易出錯。 有很多更好的方法可以做到這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.