2013-07-05 34 views
5

我正在測試我的run()函數,以確保它具有在方法結尾填充所有正確的東西。我從我們的數據庫,兩個字符串和兩個IEnumerable(字符串)填充4個字段。這個想法是把所有的人都從數據庫中打印出來。Console.Write是否會失敗?

當我只打印字符串字段,一切工作正常。但是,當我嘗試添加Enumerables時,也沒有任何打印。我還打印了一個櫃檯,所以我知道該程序仍在運行並正在運行。由於空間或其他原因,控制檯是否決定不打印任何內容?

下面是做它的代碼:

int i = 0; 
foreach (Contact contact in Contact.LoadWithPredicate(getAll)) 
     { 
       -------other code to populate fields--------- 

       i ++; 
       Console.WriteLine(i); 
       //Turn the Enumerables into strings for printing 
       string firstEnumAsString = String.Join(", ", firstEnumerable.ToArray()); 
       string secondEnumAsString = String.Join(", ", secondEnumerable.ToArray()); 

       Console.WriteLine("Email: " + firstString+ ", correspondance: " + secondString+ ", PAM addresses: " + firstEnumAsString+ ", famousPeople: " + secondEnumAsString); 
} 

所以,我的輸出,當我運行上面的代碼,我得到這樣的輸出:

1 

2 

Email: [email protected], correspondance: John, PAM addresses: [email protected], famousPeople: foo, bar, foo 

3 

4 

etc 

問題是,只有兩個總數(〜425)中的人出現,其餘的線只是數字。我不應該至少得到字符串「電子郵件」和「通信」嗎?看來控制檯只是決定不做任何事情。我知道代碼必須達到它,因爲它在打電話給Console.WriteLine()之前打印出整數。

在另一方面,每當我只是要求要打印兩個字符串字段,控制檯顯示所有用戶425這兩個領域,其相應的整數之後。有人知道這裏發生了什麼? TIA

+0

Console.Write可能會失敗,如果任何正在監聽它失敗。你有沒有附加任何自定義偵聽器,或者你只是從命令行運行它? –

+0

沒時間去測試它,但是在某些運行時如果你用null連接,最終的結果是null。你正在加入的東西是否爲空? – MatthewMartin

+0

在你的'Console.WriteLine'行設置一個斷點,並檢查所有變量是否都有值? – Shaharyar

回答

4

根據您的意見,我認爲您的firstEnumerablesecondEnumerable對象是null。但既然你沒有張貼你如何獲得這些對象,我不能爲什麼他們null或如何解決它發表評論。

沒關係爲他們包含null,甚至是完全空的,但他們自己也不能null或當你與他們聯繫.ToArray()會拋出ArgumentNullException。這與您看到的「值不能爲空」異常消息相對應。

它沒有崩潰並且難以燃燒的原因是因爲您在迭代循環中吞吐(並記錄?)了代碼示例中未發佈的try/catch塊的異常。


我猜你的實際代碼是這樣的:

foreach (Contact contact in Contact.LoadWithPredicate(getAll)) 
{ 
    try 
    { 
     ... 

     object[] firstEnumerable = null; 
     object[] secondEnumerable = null; 

     //some logic gates here which under some circumstances do not 
     //assign a valid instance to firstEnumerable or secondEnumerable 

     ... 
     Console.WriteLine(i); //this prints every time 

     //Turn the Enumerables into strings for printing 
     string firstEnumAsString = String.Join(", ", firstEnumerable.ToArray()); //exception here 
     string secondEnumAsString = String.Join(", ", secondEnumerable.ToArray()); //or exception here 

     Console.WriteLine("Email: " + firstString+ ", correspondance: " + secondString+ ", PAM addresses: " + firstEnumAsString+ ", famousPeople: " + secondEnumAsString); 
     ... 
    } 
    catch 
    { 
     //maybe some logging? maybe not? 
    } 
} 

這將每次打印出i值。但是,當它嘗試創建firstEnumAsStringsecondEnumAsString時,它會拋出異常並且從不會擊中第二個Console.WriteLine("Email: " + ...);,從而產生您所看到的輸出。這並不是說Console.WriteLine失敗了,而是你永遠不會打電話給它。

2

如果value爲null,則只有行結束符被寫入標準輸出流。 有關線路終端的更多信息,請參閱的WriteLine()方法的註釋部分。 - Source

最重要的是,如果你試圖寫入控制檯的一個值在下面的代碼拋出Exception,如:

private static string SomeVal { get { throw new Exception(); } } 

    Console.WriteLine("Foo"); 
    Console.WriteLine("This throws an exception: " + SomeVal); 

「這將引發異常: 「也不會寫入控制檯;整個字符串被認爲是null。對我來說,它看起來就是你的代碼中實際發生的事情;您試圖寫入控制檯的其中一個值是拋出一個異常,並且在某處靜靜地處理它。你在一個壓制try/catch子句中運行這個代碼嗎?

你可以很容易計算出,如果這是通過把一個斷點Console.WriteLine或尾隨}的情況,並檢查firstStringsecondString值,看看它們是否爲空。您還可以判斷您嘗試寫入的某個值是否引發異常。

此外,你應該考慮使用string.Format(string format, params object[] args),而不是連接+。使調試代碼變得更容易。

+0

謝謝@Aevitas,我很感激。有什麼辦法可以讓控制檯在這些字段中寫出空值,而不是讓整個字符串爲空? –

+2

@AlexChumbley使用格式'firstString ?? 「NULL」'它被稱爲[null-coalescing操作符](http://msdn.microsoft.com/en-us/library/ms173224.aspx),如果變量爲空,它將替換它後面的任何內容。 ?'。 –

+0

問題在於,如果我的假設是正確的,並且這些值實際上會引發異常,那麼它們的值不是'null' - 它們實際上沒有值,並且在檢查'null'時,它們將在執行期間被簡單地跳過。 – aevitas

相關問題