null的偉大與可怕 之 string字串 1基本型別會被自動初始化為null的偉大與可怕 之 string字串方法2
null的偉大與可怕 之 optional操作 3
byte short int long –> 0
float double –>0.0
boolean –> false
char –> 」 轉換成int 為 0 空字元
引用型別則統一為 null ,但是物件引用會被初始化為 null。
當嘗試呼叫null物件的方法,就會丟擲空指標異常。
但是 通常,print 乙個 null 物件而不會丟擲異常,且輸出的值為 null。
那麼為什麼可以輸出乙個 null 物件不會丟擲異常且值為null?
是不是null物件的值就是null呢?
package sun.rain.amazing.strnull;
/** * created by sunrainamazing on sun_rain_amazing
*@author sunrainamazing
*/import sun.rain.amazing.bean.user;
import org.junit.test;
public
class
stringnull
/*沒有丟擲異常,而是列印了null。
顯然問題的線索在於print函式的原始碼中。我們找到print的原始碼:
public void print(string s)
write(s);
}看到原始碼才發現原來就只是加了一句判斷而已,簡單而又粗暴,僅賦值為 null。
*//**
* 測試非string 型別的 null物件
*/@test
public
void
testnostringnull1()
/**我們再去看看print的原始碼:
public void print(object obj)
有點不一樣的了,看來秘密藏在valueof裡面。
public static string valueof(object obj)
看到這裡,我們終於發現了列印 null 物件不會丟擲異常的秘密。
print方法對 string 物件和非 string 物件分開進行處理。
【string 物件】:直接判斷是否為null,如果為 null給null物件賦值為"null"。
【非 string 物件】:通過呼叫string.valueof方法,
如果是 null 物件,就返回"null",否則呼叫物件的tostring方法。
通過上面的處理,可以保證列印 null 物件不會出錯。
*//* ***********************************
null 物件與字串拼接會得到什麼結果?
string s = null;
s = s + " is not null ";
system.out.print(s);
***********************************
編譯器對字串相加會進行優化,首先例項化乙個stringbuilder,
最後呼叫tostring返回乙個string物件。
string s = "a" + "b";
//等價於
stringbuilder sb = new stringbuilder();
string s = sb.tostring();
//針對 string 物件
if (str == null)
int len = str.length();
ensurecapacityinternal(count + len);
str.getchars(0, len, value, count);
count += len;
return this;
}//針對非 string 物件
}//針對 null物件
int c = count;
ensurecapacityinternal(c + 4);
final char value = this.value;
value[c++] = 'n';
value[c++] = 'u';
value[c++] = 'l';
value[c++] = 'l';
count = c;
return this;}*/
@test
public
void
stringbuffer sbuffer = new stringbuffer("ad");
system.out.println(sbuffer.tostring());
}}
null 與 的區別
string str1 null str引用為空 string str2 str應用乙個空串 也就是null沒有分配空間,分配了空間,因此str1還不是乙個例項化的物件,而str2已經例項化。注意因為null不是物件,是物件。所以比較的時候必須是 if str1 null 和if str2.equa...
OJ 系列之可怕的n的階乘
計算階乘n 是一件可怕的事情,因為當n並不是很大時,n 將是乙個很大的值。例如13 6227020800,已經超過了我們常用的unsigned int型別的取值範圍。請設計乙個程式,使其可以計算100以內的數的階乘,結果用字串的形式輸出 詳細描述 介面說明 原型 void calcnn int n,...
DBNull與Null的區別
null是.net中無效的物件引用。dbnull是乙個類。dbnull.value是它唯一的例項。它指資料庫中資料為空 時,在.net中的值。null表示乙個物件的指向無效,即該物件為空物件。dbnull.value表示乙個物件在資料庫中的值為空,或者說未初始化,dbnull.value物件是指向有...