首先看個例子
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變量就不用讀了嗎?既然要比較肯定也要讀啊,問題
只是先後的問題。爲什麼放在後面就就不報空指針呢?
看了一下string類的equals方法
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爲空的時候,就不會出現空指針異常嗎 ?
後來經過一番討論後,我得出的結論是這樣的:
問題是出現在調用方法上了。因爲null值,並不是一個String對象。而你通過聲明的String對象引用去 調用了String對象的實例方法。當然不可以了。null調用了方法。
所以系統報出了,空指針異常。
使用isEmpty()報空指針異常
使用isEmpty()是出現了空指針異常NullpointException;
原來isEmpty()用來判斷一個變量是否已經初始化了,因爲“”和new 的時候系統都會爲其分配內存,不管是否有值,當爲null的時候,系統的不會爲其分配內存,這是它是不存在的,如果調用isEmpty()方法時JDK根本不知道這是什麼所以會報空指針異常;
例子:
(值).isEmpty() 如果值爲null 會返回空指針異常
解決方法:
StringUtils.isEmpty(值)
這種方法如果值是" ",null 都能返回true