主頁 > 知識(shí)庫 > 未將對(duì)象引用設(shè)置到對(duì)象的實(shí)例 (System.NullReferenceException)

未將對(duì)象引用設(shè)置到對(duì)象的實(shí)例 (System.NullReferenceException)

熱門標(biāo)簽:銅川小型外呼系統(tǒng)運(yùn)營商 浙江外呼系統(tǒng)怎么安裝 云南外呼電銷機(jī)器人系統(tǒng) 海外地圖標(biāo)注門市標(biāo) 山西防封卡電銷卡套餐 廈門商鋪地圖標(biāo)注 地圖標(biāo)注多個(gè)行程 陜西人工外呼系統(tǒng)哪家好 上海楊浦怎么申請(qǐng)申請(qǐng)400電話
下面基礎(chǔ)的解釋一下這錯(cuò)誤:
1:本質(zhì)上的錯(cuò)誤:
復(fù)制代碼 代碼如下:

object a;//a是Null對(duì)象
protected void Page_Load(object sender, EventArgs e)
{
a.ToString();//調(diào)用一個(gè)Null對(duì)象的方法
}

當(dāng)然啦!結(jié)果就如下圖了:

這么赤裸裸的寫出這種代碼,不太容易,通常更傾向于下面一種:

2:通常性的錯(cuò)誤:

示例1:一個(gè)過濾某些字符的函數(shù):
復(fù)制代碼 代碼如下:

public static string FilterValue(string value)
{
string[] filterChar = new string[] { "\'", ",", ">", "", "=", ";", """, "--" };
for (int i = 0; i filterChar.Length; i++)
{
value = value.Replace(filterChar[i], "");
}
return value.Trim(' ');
}

這個(gè)函數(shù)比如容易看的出:如果value傳進(jìn)來為Null的時(shí)候,就等于Null.Replace被調(diào)用,就出現(xiàn)了上面的錯(cuò)誤。
因此,通常的,在函數(shù)的首行,都會(huì)對(duì)value進(jìn)行:if(!string.IsNullOrEmpty(value)) 一下。

示例2:再舉一下通用性的調(diào)用錯(cuò)誤,綁定,Eval("字段") ,這個(gè)方法比較常見,某些情況要轉(zhuǎn)字符串比較,這里示例一下:

%# Eval("字段").ToString()=="1"?"Yes":"No" %>

當(dāng)Eval("字段")為Null時(shí),一個(gè)Null.ToString(),必然也會(huì)出現(xiàn)上面的錯(cuò)誤,那什么情況出現(xiàn)?
1:字段的值為Null
2:空數(shù)據(jù)行,就是你表一行數(shù)據(jù)都沒有,全是Null。
復(fù)制代碼

所以預(yù)防性的寫法是:
%# Convert.ToString(Eval("字段"))=="1"?"Yes":"No" %

好了,看到本文的不管懂的還是不懂的,現(xiàn)在都應(yīng)該懂了,如果你非要說你不懂,我得贊揚(yáng)你智商高,下面有智商介紹,別放過。

見到這異常:就是一個(gè)Null的對(duì)象調(diào)用了方法(屬性或其它成員)變成Null.XXX引發(fā)的。

當(dāng)然啦,出現(xiàn)這種異常的場(chǎng)景,那可是萬萬千,數(shù)也數(shù)不完,但本質(zhì)是一樣的。

個(gè)人觀點(diǎn)認(rèn)為,在三只鳥中發(fā)生此錯(cuò)誤的原因各不同,基本如下:
復(fù)制代碼 代碼如下:

新鳥:不知道這個(gè)錯(cuò)誤,或見這錯(cuò)誤的次數(shù)太少,所以代碼基本防都不防,模仿式,大量的函數(shù)都潛伏這種錯(cuò)誤殺手。

個(gè)人猜測(cè):新鳥寫的代碼,都不加判斷的原因可能:
其一:是他們不知這種情況,剛學(xué)習(xí),經(jīng)驗(yàn)不足,未有處理這種異常的經(jīng)驗(yàn)。
其二:推測(cè)是他們高調(diào)的認(rèn)為:多一個(gè)Null的判斷,會(huì)使得性能下降,他們追求高性能,因此,基本上,不加。



中鳥:知道這個(gè)錯(cuò)誤,只是考慮的不多,心不夠細(xì),人不夠穩(wěn),寫代碼基本會(huì)加,但普遍不加。

中鳥比新鳥吃的蟲,肯定多,所以出現(xiàn)這種情況,原因當(dāng)然不一樣了啦。
個(gè)人猜測(cè):中鳥寫的代碼,出現(xiàn)Null引用的原因可能是:
復(fù)制代碼 代碼如下:

其一:沒有養(yǎng)成思維習(xí)慣,在加班的壓力下,寫個(gè)函數(shù)都是刷刷的就出來了,偶爾會(huì)加,普遍不加,加還是不加,等錯(cuò)誤出來了再加。

其二:中鳥這時(shí)期處于高性能研發(fā)性時(shí)期,最喜歡的和別人討論性能問題,特別是當(dāng)for的次數(shù)達(dá)到百萬級(jí)別時(shí),當(dāng)性能從0.03秒下降到0.01秒時(shí),會(huì)為整整提高3倍的性能而歡乎,并認(rèn)為這是一個(gè)重量級(jí)的發(fā)現(xiàn),然后推薦推薦給后來者,并BS一些不這么寫的新手或同級(jí)的鳥。
同理:一個(gè)函數(shù)加一個(gè)null判斷,得上升到百萬次的調(diào)用級(jí)別的高度考慮,如果這判斷被調(diào)用百萬次,那性能不是大大的損失?
如果加2個(gè)判斷,那就是2*百萬次的調(diào)用,那就是相當(dāng)大的性能損失,這怎么可以接受的呢?
所以,能不加就不加,加不加,等錯(cuò)誤出來了再加。
其三:太懶了,這個(gè)本人是這么理解的說:
大伙都知道,中鳥寫代碼,基本都屬于面向?qū)ο笮偷牧?,那就是天天和?duì)象搞在一塊的了,每個(gè)對(duì)象都要搞來搞去,再多的精也傷不起!
好吧,一個(gè)函數(shù)傳一個(gè)參數(shù),給你加一個(gè)判斷,代碼也不多,不算大括號(hào)就兩行。
可是中鳥基本上寫的函數(shù)的參數(shù),偏偏三四五六七八九十個(gè),這下讓人糾結(jié)了:
加吧,一想,工作量太大了,而且這性能感覺不高;
不加吧,好像也沒什么問題,這么一想啊,眼前闊然開朗,好,加不加,錯(cuò)誤出來了再加。
還有的,不僅是參數(shù)的判斷要折騰,函數(shù)內(nèi)部產(chǎn)生的對(duì)象,也要搞一搞,太多對(duì)象要考慮。
光靠精力與考慮,加點(diǎn)人之常情,所以大多數(shù)情況是發(fā)生在:加不加,錯(cuò)誤出來了再加!



老鳥:對(duì)這錯(cuò)誤太熟悉,心也夠細(xì),寫代碼潛意識(shí)會(huì)主動(dòng)加防,但百密一疏,該來的還是會(huì)來,躲過初一,躲不過十五。

老鳥吃的蟲就更多了,而且老鳥們身經(jīng)百戰(zhàn)之后,覺得系統(tǒng)穩(wěn)定,才是幸福。
個(gè)人猜測(cè):老鳥寫的代碼,出現(xiàn)Null引用的原因可能是:
復(fù)制代碼 代碼如下:

其一:代碼寫多了,基本上都靠潛意識(shí)反應(yīng),就是說潛能發(fā)揮了,再白點(diǎn)就是習(xí)慣性思維。
所以基本上都不會(huì)怎么犯這錯(cuò)誤,但是光靠潛意識(shí),基本都能擋住,基本之外的,還得靠正常思維。
老鳥通常精力不太好,偶爾會(huì)走神,一走神,就漏了一個(gè),再一走神,又漏了一個(gè),再一走神,被神招喚了,太平間多了一位客人。
所以我寫代碼,盡量不走神,免的被招喚,但偶爾也會(huì)漏。
其二:是假老鳥,老鳥是裝的,其實(shí)還是中鳥,硬要裝,不過會(huì)裝,說明智商高。
社會(huì)的法則表明,生存的越好的,裝的程度越高,越會(huì)裝,生活就越好,裝到最高境界,那就是裝孫子。
孫子是一名歷史人物:會(huì)三十六計(jì),裝孫子的說明智商真的很高,沒里絕對(duì)沒有鄙視之意,因?yàn)槿?jì)有時(shí)候我也在學(xué),只是智商一直上不去,所以境界一直上不去。


下面再補(bǔ)充一下,個(gè)人對(duì)中老鳥的看法,以下觀點(diǎn)僅為作者扮演的個(gè)人的臆測(cè)觀點(diǎn),和作者本人無關(guān):

中鳥何以追求性能?
復(fù)制代碼 代碼如下:

臆測(cè):因?yàn)樗麄兺ǔV唤佑|到系統(tǒng)的一部分,缺少整個(gè)系統(tǒng)體系的了解,所以他們希望在他們負(fù)責(zé)的那一個(gè)區(qū)域里,寫出性能至上的代碼,這能說有錯(cuò)嗎?
沒錯(cuò),而且理論上就應(yīng)該這么干!但是,穩(wěn)定不足,如果能寫出又穩(wěn)定又高性能的代碼,有多好呢!


重點(diǎn)還是講老鳥:老鳥何以不太關(guān)注性能,而求穩(wěn)定?

其實(shí),老鳥并不是不關(guān)注性能,而是他關(guān)注的是:

一:穩(wěn)定,這個(gè)很重要:
復(fù)制代碼 代碼如下:

因?yàn)橄到y(tǒng)一上線:
首先:得對(duì)老板負(fù)責(zé)啊,你說是不是?
然后:如果這個(gè)產(chǎn)品是要給客戶演示的,那得對(duì)客戶負(fù)責(zé)啊,你說是不是?
再者:如果這個(gè)產(chǎn)品要上線運(yùn)營,那得對(duì)訪客負(fù)責(zé)啊,你說是不是?
所以,不管你系統(tǒng)怎么樣,首先,保證穩(wěn)定,至少給老板或客戶或訪客演示或操作的時(shí)候,你不能出錯(cuò),至于慢點(diǎn)不慢點(diǎn),那個(gè)好商量,好商量。


二:整體性能大于局部性能
復(fù)制代碼 代碼如下:

I:這個(gè)就很明顯了,你一個(gè)算法寫的很好,可是其它選手?jǐn)?shù)據(jù)庫寫的差,一訪問,很慢,這怎么說的過去。
II:所以要保證整體訪問性能差不多先,然后再進(jìn)行局部優(yōu)化,這多符合中國人當(dāng)前的優(yōu)化思維啊。
III:再說了,每個(gè)人局部性能都最大化了,一訪問,還是慢,找不到著優(yōu)化的地方,這可是要出事的:老板得出血買硬件了。
IV:還有,整體上加了緩存+靜態(tài)化html后,你會(huì)發(fā)現(xiàn),局域的最大優(yōu)化代碼,基本都派不上用場(chǎng)了,因?yàn)橹苯泳褪窃L問+返回,
至于您那最大化性能的邏輯代碼,那是千年走一回了。


當(dāng)然了,個(gè)人對(duì)此觀點(diǎn)是很負(fù)責(zé)的,絕對(duì)沒有任何輕視局部性能最大化的意思,相反還得鼓勵(lì)大伙局部性能最大化,努力寫出最優(yōu)代碼:
復(fù)制代碼 代碼如下:

一來:這是每個(gè)碼農(nóng)往上走必經(jīng)的階段,跳過不是件好事。
二來:多讓老板出下血,可以平衡下員工不滿的心情:你讓我加班,我就讓你出血,多好呢。


重大說明:
本篇文章絕大多數(shù)觀點(diǎn)為作者扮演的個(gè)人的臆測(cè)觀點(diǎn),和本人無關(guān),本人認(rèn)為,以上觀點(diǎn)有些片面,可能與客觀事實(shí)不符。
請(qǐng)各位看客看在周末的份上,少一份偏激,多一份激動(dòng),開X吧!

本視頻到此為止,歡迎收看,下次再會(huì),謝謝!

PS:最近順路折騰了下 CYQ.Data V4.5離線幫助文檔,很快發(fā)布,敬請(qǐng)關(guān)注。
您可能感興趣的文章:
  • System.Data.SqlClient.SqlException: 無法打開登錄所請(qǐng)求的數(shù)據(jù)庫 登錄失敗。
  • System.Data.SQLite 數(shù)據(jù)庫詳細(xì)介紹
  • SQL Server出現(xiàn)System.OutOfMemoryException異常的解決方法
  • System.UnauthorizedAccessException:拒絕訪問的處理辦法.
  • System.Runtime.InteropServices.COMException的解決方法
  • System.Data.OleDb.OleDbException: 未指定的錯(cuò)誤的完美解決方法

標(biāo)簽:常州 自貢 朔州 信陽 西雙版納 萊蕪 孝感 許昌

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《未將對(duì)象引用設(shè)置到對(duì)象的實(shí)例 (System.NullReferenceException)》,本文關(guān)鍵詞  未將,對(duì)象,引用,設(shè)置,到,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《未將對(duì)象引用設(shè)置到對(duì)象的實(shí)例 (System.NullReferenceException)》相關(guān)的同類信息!
  • 本頁收集關(guān)于未將對(duì)象引用設(shè)置到對(duì)象的實(shí)例 (System.NullReferenceException)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章