null的偉大與可怕 之 String字串 1

2021-07-31 21:46:20 字數 2472 閱讀 8096

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物件是指向有...