null == a or a == null 及java String 非空判斷
今天在論壇上看到一個帖子,討論的是null == 和 == null的區別,比較多的人都說是沒有區別的。其中有一個人說因為寫了 == null而被頭說了,下面便一堆人說這個頭不懂技術。今天,我就這個問題說下自己的看法。
首先,把這個問題一般化,即將變數與常量做比較時,常量寫在等式左邊好還是右邊好?
常量== 變數是一樣良好的程式設計習慣,可以避免出錯一些不必要bug((在少寫了個=的進時候)。當然這一點在java裡已經沒有那麼明顯了,但還是可以證明的,請看以下程式碼:
在變數 == 常量情況下:
-
boolean istrue = false;
-
//如果istrue為false則輸出失敗
-
if(istrue == false){
-
System.out.println("失敗");
-
}
以上程式碼沒有出現語法和邏輯問題,再看以下程式碼(一不小心寫少了個=):
-
boolean istrue = false;
-
//如果istrue為false則輸出失敗
-
if(istrue = false){
-
System.out.println("失敗");
-
}
這時候問題就比較嚴重了,這段程式碼沒有語法錯誤,沒有編譯和執行時的錯誤,但它的邏輯卻出了錯!!!
我們再來看常量 == 變數的情況:
-
boolean istrue = false;
-
//如果istrue為false則輸出失敗
-
if(false == istrue){
-
System.out.println("失敗");
-
}
首先這樣也是不會出現問題的,再來看下面(一不小心寫少了個=):
很明顯出錯了語法錯誤了!!!
當然以上的例子在java沒有意義,因為更多的時候我們在if中的boolean型別不會使用==,而且java中的if語句只能使用型別,所以說以上的問題在java中基本不會出現,但是,在其他的語言中會出錯,比如C,下面我們就看下C出現的問題。
我們知道,在C中,if語句中的值,0這假,非0為真,也就是說if語句中可以是非bool型別的數值,以下C程式碼沒有語法錯誤,邏輯上卻是錯了。
-
int vis = 0;
-
//如果vis等於0輸出
-
if(vis = 0){
-
printf("成功");
-
}
綜上所述,使用常量 == 變數的原因與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("'");
}
==========================================================
好了,以上就是今天分享的全內容,由於是個人經驗總結,難免會出錯,歡迎大家批評指正,萬般感謝。