iT邦幫忙

0

System.NullReferenceException 疑問

  • 分享至 

  • xImage

小的有一支api 然後因為有一些需求需要調整
程式碼如下

      if (一些邏輯判斷)
      {
		  //傳入參數處理
          string A = HttpUtility.HtmlEncode(body.A),
                 B = HttpUtility.HtmlEncode(body.B),
                 C = HttpUtility.HtmlEncode(body.C),
                 D = HttpUtility.HtmlEncode(body.D);

          ///A解碼:
          A = HttpUtility.UrlDecode(EncandDec_Extensions.Dec_AES(A, AESKey, null));
          bool result = int.TryParse(A, out int a);
          if (result)
          {
		      //這邊是調整需求加上的
			  var rs = (from r in _db.Register
			  join m in _db.Member on r.company_code equals m.Company_Code
			  where r.serno == a
			  select new
			  {
				m.AccountID
			  }).FirstOrDefault();				
			  }
		  }

我這次的疑惑點是
前面幾行根本沒有更動過
但在我加上了我新的code之後
當我才一進到

string A = HttpUtility.HtmlEncode(body.A)

第一行這邊
我就看到visual studio下面會顯示每個參數值的地方
已經出現 a
擲回 'System.NullReferenceException' 類型的例外狀況int {System.NullReferenceException}
想當然爾到

bool result = int.TryParse(A, out int a);

就直接噴錯了

但我拔掉我新增的code
a就可以正確被解析是 0

小的非常困惑
後來權宜之計是寫了一個

int a = 0;

在我的

if (一些邏輯判斷)

的外面
才得以解決
但我還是很想知道究竟為什麼會這樣

小的寫code 經歷不長,還望各位大神指教~萬分感激

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
純真的人
iT邦大師 1 級 ‧ 2024-05-27 19:44:07

string A = HttpUtility.HtmlEncode(body.A)
是 System.NullReferenceException
表示 HttpUtility.HtmlEncode(body.A) = null
若要防null錯誤~可以加上空字串~

string A = HttpUtility.HtmlEncode(body.A) + "";

這樣都會是空字串~而不是 Null 值

亦即

//傳入參數處理
string A = HttpUtility.HtmlEncode(body.A) + "",
 B = HttpUtility.HtmlEncode(body.B) + "",
 C = HttpUtility.HtmlEncode(body.C) + "",
 D = HttpUtility.HtmlEncode(body.D) + "";
wasd14839 iT邦新手 5 級 ‧ 2024-05-28 10:08:26 檢舉

感謝大大的回答,可能我表達不清楚

string A = HttpUtility.HtmlEncode(body.A)

這一串是可以正確被執行完的
而我的body.A 也一定會有值
因為我自己用postman打我都會給值進去~
可是他是
out int a
的這個小寫a
在一進這個方法時
(也就是string A = HttpUtility.HtmlEncode(body.A) 這行
上面的if只是一些驗證)
就是null
正常應該要是0才對

後來把宣告放在最外面才解決

int a = 0;
if(....)
{
bool result = int.TryParse(A, out a);
}

恩~這個就照可以解決的方式來處理~
這些細節問題~都是出錯後~用一些調整才修正好。

0
念戀
iT邦新手 5 級 ‧ 2024-05-29 09:42:37

感覺就只是版本問題吧 ?
GTP :

在C#中,使用 out 变量的内联声明(例如 out int a)是从 C# 7.0 版本开始引入的。在这之前,你必须在调用 int.TryParse 之前显式地声明 a 变量。

看更多先前的回應...收起先前的回應...
wasd14839 iT邦新手 5 級 ‧ 2024-05-29 09:47:37 檢舉

先感謝你的回答
不過我內文也有提到
我原本寫法都沒有更動過
是後來新增了幾行DB的操作之後
才開始會有這個錯誤的~

念戀 iT邦新手 5 級 ‧ 2024-05-29 10:47:35 檢舉

抱歉我眼瞎!
話說可以貼個 System.NullReferenceException 訊息的圖嗎!
沒見過
bool result = int.TryParse(A, out int a);
這段出錯的樣子

wasd14839 iT邦新手 5 級 ‧ 2024-05-29 13:13:34 檢舉

https://ithelp.ithome.com.tw/upload/images/20240529/20167331J0ufbK94sy.pnghttps://ithelp.ithome.com.tw/upload/images/20240529/20167331pUI0sUPlOp.png

這就奉上

圖一還沒跑到out那邊所以regNo是null很合理,導致錯誤的原因可能是RegNo,可以看看他是否真的有值

wasd14839 iT邦新手 5 級 ‧ 2024-05-30 15:26:24 檢舉

可以看我最上面的回答喔
是都有值的,就只是差在我新增的CODE
其餘都不變
圖一那行跑完也可以正確被解析
至於你說的
"圖一還沒跑到out那邊所以regNo是null很合理"
我不這麼認為喔
沒出錯的情況下(也就是我沒增加新的CODE之前)
他會是0
也應該要是0喔 因為初始化的int就應該是0

我要發表回答

立即登入回答