"aa".equals(a)這種寫法爲何就能夠避免空指針。

public static void main(String[] args) {
  String a=null;  
  if("aa".equals(a))//這種情形,不出現空指針異常  
  //if(a.equals("aa"))//出現空指針異常 
   {  
   System.out.println(true);  
   }  else {
         System.out.println(false); 
          } 
   }

上面的兩句不一樣的比較語句測試,第一句不出現空指針異常,第二句出現。 
因此在變量和常量比較的時候,通常把常量放在前面。爲了不空指針異常。 
可是個人問題是:變量在前時候,讀到變量,變量爲空,就出現異常了。 
爲何變量在後時候,a變量就不用讀了嗎?既然要比較確定也要讀啊,問題 
只是前後的問題。爲何放在後面就就不報空指針呢?java

以前對這個問題,在公司上班的時候,聽到別人說這樣的寫法是爲了不空指針。的確我驗證了一下,是能夠避免空指針。後來想深究上面的我提出的問題時候,老同事告訴,這也是造成了一種編程規範。今天想一想規範,也有必定的理由。編程

今天在咱們的技術交流羣裏面有出現了這個問題,有引起了個人深思。測試

因而發了個帖子,this

看了一下string類的equals方法spa

public boolean equals(Object anObject) { 
    if (this == anObject) {
           return true;    
    }
    if (anObject instanceof String) {
         String anotherString = (String) anObject;
         int n = value.length;       
         if (n == anotherString.value.length) {         
         char v1[] = value;         
         char v2[] = anotherString.value;         
         int i = 0;         
         while (n-- != 0) {          
          if (v1[i] != v2[i])               
              return false;           
              i++;         
          }         
          return true;       
      }     
      }    
       return false;   
}

可是個人問題有來了指針

源碼我看了一下,也明白,可是在源碼中若是anobject爲空的時候,就不會出現空指針異常嗎 ? 
後來通過一番討論後,我得出的結論是這樣的。code

問題是出如今調用方法上了。由於null值,並非一個String對象。而你經過聲明的String對象引用去 調用了String對象的實例方法。固然不能夠了。null調用了方法。orm

因此係統報出了,空指針異常。對象

因此說,呼應文章的標題,這樣還真的是避免了控制針異常。畢竟「aaa」這樣的形式,不是null形式,是能夠調用方法的。接着咱們在按String類裏面的equals方法作比較就OK的啦。源碼

相關文章
相關標籤/搜索