2017-03-12 50 views
1

XML元素,當我收到試圖訪問,這並不使用LINQ存在的XML元素時出現以下錯誤:的NullReferenceException引用不存在

型「System.NullReferenceException」的第一次機會異常發生在Test.exe System.NullReferenceException中的 :對象引用 未設置爲對象的實例。

bool exists = website.Parent 
      .Element("Exclusions") 
      .Elements("Exclusion") 
      .Where(x => thisKeyword.ToUpper().Contains((string)x.Value.ToUpper() ?? "~")) 
      .Any(); 

我可以簡單地使用.Where(x => thisKeyword.Contains((string)x))

解決這個問題,但我需要兩個thisKeyword和XML元素值轉換(如果存在的話),以大寫字母來獲得一個區分大小寫的比較。

我的印象是,?? "~"意味着「如果什麼左邊是空的使用什麼是正確的,所以在這種情況下x應該成爲波浪線,因此不驗證對thisKeyword(因爲它不會永遠包含波浪號) 。粗方法,我同意...但它甚至不工作

我怎樣才能防止在NullReferenceException異常

+2

的【什麼是一個NullReferenceException,如何解決呢?]可能的複製(HTTP://計算器.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) –

+0

看看什麼是null,thisKeyword,x或x.Value會殺了你。必須先進行空檢查。 –

+1

我認爲你可以使用下面的代碼'thisKeyword?.ToUpper()。包含((串)X?.Value.ToUpper()?「〜」)'檢查這兩個不爲空 – ganchito55

回答

1

假設x.Value爲null,並且thisKeyword是已知的非空:?

發生事故b因爲??運算符正試圖檢查ToUpper()返回的值是否爲空。但是,它不能撥打ToUpper(),因爲x.Value不存在。

在C#6或更高版本可以使用空傳播算子?.,其訪問屬性當且僅當該對象是非空:

.Where(x => thisKeyword.ToUpper().Contains(
      (string)x.Value?.ToUpper() ?? "~") 

可替換地,只使用一個單獨的Where條款檢查x.Value是非空:

.Where(x => x.Value != null) 
.Where(x => thisKeyword.ToUpper().Contains(x.Value.ToUpper()) 

順便說一句,你可以把條件Any()條款,而不是裏面:

.Elements("Exclusion") 
.Any(x => x.Value != null && thisKeyword.ToUpper().Contains(x.Value.ToUpper()) 

而且你不一定需要轉換爲大寫兩種:

.Any(x => x.Value != null && 
      thisKeyword.IndexOf(x.Value, 
      StringComparison.InvariantCultureIgnoreCase) > 0) 
+1

你在正確的軌道,而不是搞亂貓王操作符,你可以使用更簡單的東西 - [string.Equals(string,string,comparisonType)](https://msdn.microsoft.com/en-us/library /t4411bks(v=vs.110).aspx)靜態方法。它可以容忍空值,並且可以指定不區分大小寫的檢查(這是人們在檢查之前執行ToUpper()或ToLower()的最常見原因) 。 – slugster

+0

謝謝你。它看起來像我不能使用價值?屬性,所以我必須在舊版本的C#上。 如果.Elements(「Exclusion」)和.Element(「Exclusions」)不存在於XML中,我的下一個問題是如何處理NullReferenceException? – James

相關問題