2014-02-21 37 views
0

我有System.NullReferenceException的一些問題。當服務器做的事情,我們首先檢查用戶是不是空的,然後他斷開連接和服務器進展的東西,它試圖得到用戶來自System.NullReferenceException。我有超過20 000行代碼,所以我需要一些不像總是檢查它是空的..我的服務器是多線程,所以套接字連接並斷開用戶在背景上的所有時間,所以這就是爲什麼這.. ..我想停止進展,當用戶斷開連接。如果我把「try/catch」放在哪裏,是不是真的?C#錯誤System.NullReferenceException

例子:

if (User != null) 
{ 
    //do some things 
    System.Threading.Thread.Sleep(1000); //now we have time disconnect (This only for get error) 
    User.SendMessage("crash"); //<-- System.NullReferenceException... -.- 
} 
+0

http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it –

+1

@SonerGönül你的鏈接並不能解釋如何解決這個特定的問題 –

+1

20 000行代碼 - >沒有太多,如果你有適當的架構,如果它在一個方法中的所有時間折射,除了檢查null以避免空例外是沒有出路 –

回答

3

它看起來像User的值在測試後但在致電之前正在改變。如果您的應用程序是多線程的,我懷疑另一個線程在您睡覺時將User設置爲空。

一個辦法是抓住User和對證:

var user = User; 
if (user != null) 
{ 
    //do some things 
    System.Threading.Thread.Sleep(1000);get error) 
    user.SendMessage("crash"); // Need to be sure user is in a valid state to make call 
} 

這種方式可以確保你有一個有效的參考。您現在需要做的是確保user處於有效狀態,您可以撥打SendMessage

更新:既然你保留,以避免增加try/catch塊你可以寫一個輔助函數:

void WithUser(Action<User> action) 
{ 
    try 
    { 
    var user = User; 
    if (user != null) action(user); 
    } 
    catch(Exception e) 
    { 
    // Log it... 
    } 
} 

現在,你可以說:

WithUser(user=> 
{ 
    System.Threading.Thread.Sleep(1000); 
    user.SendMessage("crash"); 
}); 
+0

嗯..是該變種goodway,因爲示例User.GetClient()也被調用,因此如果用戶斷開連接返回太null null – user3290224

+0

@ user3290224 - I並沒有真正理解你的評論,但這是一個合理的方式來處理在多線程ap中變成'null'的屬性摺疊。你需要做的是確保對象在調用時處於有效狀態,所以你可能必須用'try/catch'塊來包圍它。 – Sean

+0

嘗試/趕上20000行?我的意思是,當用戶斷開連接並且服務器需要它時,其他函數會變爲null。其他時間示例GetClient() – user3290224

0

SendMessage拋出空例外,校驗碼在SendMessage方法

如果User去空調用之前不調用SendMessage函數: -

if (User != null) 
{ 
     User.SendMessage("crash"); //<-- No More System.NullReferenceException... -.- 
} 
+0

Nah其罰款..因爲用戶斷開連接,「用戶」變爲空.. – user3290224

0

誰設置User爲null和哪裏?當你的線程睡眠時,有人顯然將User變量設置爲null,導致崩潰。

此外:「神奇的睡眠」不會解決任何問題。你需要在這裏適當的鎖定。

+0

套接字斷開將用戶設置爲空,我的程序是多線程的,所以它可以在任何時候發生。那個睡眠就是例子,因爲它很難嘗試得到那個錯誤,因爲服務器在ms中做了事情,但是不會停止每天超過100個System.NullReferenceException;/ – user3290224

+0

然後你需要實現適當的鎖定。單獨測試null不會在多線程環境中執行。 – PMF

相關問題