字符串爲空引起的糾葛

        昨天在做項目的時候遇到一個判斷爲空的Bug。按平常的直接調用工具類來判斷是否爲空就可以啦,可是這次無論怎麼判斷都會出現和我們預想的結果有差距。
首先這個項目需要把從數據庫中的一條記錄的多列內容,去掉1兩個內容後和另外一張表中去對應,我想到的就是利用數組來解決這個問題,可是如何把一條記錄中的多列變成一個數組就讓人爲難了。突然想到可以在實體中重寫string方法,然後通過字符串的String.split(",")就可以變成了一個數組。問題就是從這兒開始的。 數據庫中的數據有可能爲空呀,查出來的結果就是爲空,也沒有分配值空間,可是在調用split後,發現數組中原來對應爲null,突然變成不是null而是“null”,這個對於判斷爲空就出現了差別。
        String isEmpty()方法也是判斷字符串爲空的方法,通過value.length()==0判斷是否爲空。但是我們一般做項目的時候都會自己寫工具類,主要就是這個方法對於一些特殊的情況沒有判斷,比如String a=null就無法通過這個方法判斷。這個方法和JDK版本有關,1.6及以後的版本才生效,所以不建議在項目中使用,以免造成兼容性問題。
  
public static void main(String args[]) {
	String a = null;
	String b = new String();
	String c = "";
	String d = "" + a + "+hello";
	if (c.equals(b)) {
		System.out.println("c.equals(b)");
	}
	if (c == b) {
		System.out.println("c==b");
	}
	System.out.println(a);// a未分配空間,無值狀態。輸出也是特殊處理的結果
	System.out.println(b);// b分配空間,有值狀態,是一種絕對的空
	System.out.println(c);// c分配空間,有值狀態,是一種相對的空,空字串
	System.out.println(d);// StringBuilder.append的一個特殊處理
	System.out.println(a.length());// 沒有分配內存,所以報空指針的異常
}


    運行結果下所示:

c.equals(b)
null


null+hello
Exception in thread "main" java.lang.NullPointerException
	at com.util.Handle.main(Handle.java:28)


        a和b並不相等,一個是有值的狀態,一個是無值的狀態。b與c也不相等,一種是絕對的空一種是相對的空,但是b與c已經基本相等。f是通過new String(),b爲“”。對於a的輸出是經過特殊處理過後的才能輸出。處理的方法如下:

public void println(String x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

public void print(String s) {
        if (s == null) {
            s = "null";
        }
        write(s);
    }
         b、c爲空輸出字符串自然是什麼都沒有。d這個是因爲在執行+的時候,經過特殊的處理。
 public AbstractStringBuilder append(String str) {
        if (str == null) str = "null";
        int len = str.length();
        ensureCapacityInternal(count + len);
        str.getChars(0, len, value, count);
        count += len;
        return this;
    }
        對於String類型的空我們一般分的比較清楚,如還有問題可參考第一篇參考的博客。
        對於String a = null;String d=""+a+"+hello"的理解不透徹可以參考第二篇參考的博客。
       參考以下兩個博客: JAVA中isEmpty和null以及""的區別 http://blog.csdn.net/lhflower123/article/details/8223607
                                            由一個簡單的String c=a+b的Java問題引發一點想法 http://mushiqianmeng.blog.51cto.com/3970029/723175/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章