1. 程式人生 > >null == a or a == null 及java String 非空判斷

null == a or a == null 及java String 非空判斷

今天在論壇上看到一個帖子,討論的是null == 和 == null的區別,比較多的人都說是沒有區別的。其中有一個人說因為寫了 == null而被頭說了,下面便一堆人說這個頭不懂技術。今天,我就這個問題說下自己的看法。

首先,把這個問題一般化,即將變數與常量做比較時,常量寫在等式左邊好還是右邊好?

常量== 變數是一樣良好的程式設計習慣,可以避免出錯一些不必要bug((在少寫了個=的進時候)。當然這一點在java裡已經沒有那麼明顯了,但還是可以證明的,請看以下程式碼:

在變數 == 常量情況下:

 
  1. boolean istrue = false;

  2. //如果istrue為false則輸出失敗

  3. if(istrue == false){

  4. System.out.println("失敗");

  5. }

以上程式碼沒有出現語法和邏輯問題,再看以下程式碼(一不小心寫少了個=):

 
  1. boolean istrue = false;

  2. //如果istrue為false則輸出失敗

  3. if(istrue = false){

  4. System.out.println("失敗");

  5. }

這時候問題就比較嚴重了,這段程式碼沒有語法錯誤,沒有編譯和執行時的錯誤,但它的邏輯卻出了錯!!!

我們再來看常量 == 變數的情況:

 
  1. boolean istrue = false;

  2. //如果istrue為false則輸出失敗

  3. if(false == istrue){

  4. System.out.println("失敗");

  5. }

首先這樣也是不會出現問題的,再來看下面(一不小心寫少了個=):

很明顯出錯了語法錯誤了!!!

當然以上的例子在java沒有意義,因為更多的時候我們在if中的boolean型別不會使用==,而且java中的if語句只能使用型別,所以說以上的問題在java中基本不會出現,但是,在其他的語言中會出錯,比如C,下面我們就看下C出現的問題。

我們知道,在C中,if語句中的值,0這假,非0為真,也就是說if語句中可以是非bool型別的數值,以下C程式碼沒有語法錯誤,邏輯上卻是錯了。

 
  1. int vis = 0;

  2. //如果vis等於0輸出

  3. if(vis = 0){

  4. printf("成功");

  5. }

綜上所述,使用常量 == 變數的原因與java中語法糖-泛型一樣,可以將錯誤提前到編譯時出現(在小寫個=的情況下),不管如何,這也是一種良好的程式設計習慣。

 

對於這種情況在java上更多的表現為null == string與string == null,在企業中,基本上所有的程式碼只有null == string這種判斷,與此相關的,是String的equals方法,怎樣判斷一個string 是不是""呢?嚴謹的做法是"".equals(str)而不是str.equals(""),在我學生時期我時常是使用後者,使用前者的原因是在str為null的情況下,後者會拋空指標異常。同理,我們在使用String的isEmpty方法時要注意,一定要進行非空判斷,以下是isEmpty方法的原始碼:

可以看出,isEmpty只是通過比較str的長度,甚至沒有進行.trim()的處理,使用要相當小心,所以,如果你要自己封裝工具進行判斷,可以使用以下方法:

這裡使用str.trim()的原因是若null == str則str.trim()不會執行,也就是說str.trim()不會出現String的空指標。

=============================================================

if(null ==m4 || "".equals(m4.trim()) || "null".equalsIgnoreCase(m4)){
            sb.append(",'").append(rs_user_id).append("'");
            System.out.println("m4為null進入if判斷");
        }else{
            sb.append(",'").append(m4).append("'");
            
        }

==========================================================

 

 

好了,以上就是今天分享的全內容,由於是個人經驗總結,難免會出錯,歡迎大家批評指正,萬般感謝。