2017-05-29 51 views
1

​​的第二個對象的顏色值爲null,當它通過流管道時,它檢查null上的equals(),但令人驚訝的是不引發NullPointerException。這是爲什麼?爲什麼在下面的Java Stream過濾器方法中不拋出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); 
    } 
} 
+9

這就是因爲你在做「粉紅色」.equals(顏色)而不是color.equals(「粉紅色」)。 –

+1

@ melli-182謝謝。這是我犯的錯誤。 – Srinivasan

回答

4

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

2

something.equals(null)只是false

看看java.lang.String中#等於實現:

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

你爲什麼要引用Object.equals?它不應該是'String.equals'嗎? –

+0

謝謝,這裏有點拼寫錯誤。 String.equals以相同的代碼片段開始。我會立即編輯答案。其實,我已經在編輯模式下準備好了,同時收到你的commet :) –

+0

好的,但請注意,這段代碼不是一個相關的測試來推斷當anObject參數爲空時會發生什麼 – nos

0

如果你這樣做:

color.equals("pink"); 

它會拋出一個NPE。

「粉紅」字符串

"pink".equals(color); 

相同

"pink".equals(null); 

如果你正試圖避免NPE,它是一個很好的我DEA做A.equals(B)和總是選擇你的目的是:一,你知道它不是,像枚舉

0

當訪問屬性或在Null引用上調用方法時會引發NPE,並且由JVM而不是代碼完成。如果參數爲Null,但是這是錯誤的實現,那麼我已經看到了一些實現拋出NPE的實現的實例。在這些情況下,IllegalArgumentException更有意義。

在字符串的情況下,equals方法,下面的事情都做了:

  1. 檢查兩個引用相同

  2. 檢查傳入的參數是String類型如果是這樣的:

    一。從兩個字符串中獲取char數組,並從左到右逐個比較每個字符。如果一切順利迴歸真實

  3. 否則返回false

所以,關鍵是代碼不應該拋出NPE上,他們讓更多的執行錯誤容易發生。有很多更好的方法來做到這一點。

+0

只是想給這個答案的設計視角..其他答案几乎回答問題.. – dvsakgec

相關問題