2013-07-05 3 views
5

Я тестирую функцию run(), чтобы убедиться, что у нее есть все правильные вещи, заполненные в конце метода. Я заполняю 4 поля из наших баз данных, две строки и две IEnumerable (string). Идея состоит в том, чтобы распечатать все для всех людей, которых я вытаскиваю из базы данных.Неужели Console.Write не работает?

Когда я печатаю только поля строки, все работает нормально. Однако, когда я пытаюсь добавить Enumerables, ничего не печатает вообще. Я также печатаю счетчик, поэтому я знаю, что программа все еще работает и работает. Неужели Console когда-либо решила ничего не печатать из-за пространства или чего-то еще?

Вот код, который делает это:

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) появляются, остальные строки - это просто цифры. Должен ли я, по крайней мере, получить строки «Электронная почта» и «переписка»? Кажется, что консоль просто решила ничего не делать. И я знаю, что код должен достигнуть этого, потому что он печатает целое число i перед тем, как я назову это Console.WriteLine().

С другой стороны, всякий раз, когда я просто запрашиваю, чтобы два строковых поля были напечатаны, Консоль отображает оба поля для всех 425 пользователей сразу после их соответствующего целого. Кто-нибудь знает, что здесь происходит? TIA

+0

Console.Write может выйти из строя, если что-то слушает его. У вас есть какие-либо пользовательские прослушиватели, или вы просто запускаете это из командной строки? –

+0

нет времени для его проверки, но в некоторых случаях, если вы конкатцируете с нулевым значением, конечный результат равен нулю. Любой нуль в том, что вы присоединяетесь? – MatthewMartin

+0

Установите точку прерывания в строке 'Console.WriteLine' и проверьте, имеют ли все переменные значения? – Shaharyar

ответ

4

На основе ваших комментариев, я думаю, что либо ваши firstEnumerable или secondEnumerable объектов - null. Но так как вы не опубликовали, как вы получаете эти объекты, я не могу комментировать , почему они null или как исправить это.

Это хорошо для них, чтобы содержать nullзаписи, или даже быть полностью пустым, но они сами по себе не могут быть null или выбросит ArgumentNullException при вызове .ToArray() на них. Это соответствует сообщению об ошибке «Значение не может быть нулевым», которое вы видите.

Причина, по которой это не сбой и сжигание, - это то, что вы проглатываете (и регистрируете?) Исключения в своем итерационном цикле с блоком 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 каждый раз. Но когда он пытается создать firstEnumAsString или secondEnumAsString, он выдает исключение, а никогда не не попадает на ваш второй Console.WriteLine("Email: " + ...);, таким образом производя вывод, который вы видите. Дело не в том, что Console.WriteLine терпит неудачу, это значит, что вы никогда не называете это в первую очередь.

2

Если значение равно 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 или заднюю } и проверьте значения firstString, secondString и посмотреть, если они нулевые. Вы также можете указать, было ли одно из значений, которые вы пытаетесь написать, создало исключение.

Кроме того, вы должны использовать string.Format(string format, params object[] args), а не конкатенировать с помощью +. Делает отладку вашего кода намного проще.

+0

Спасибо @Aevitas, я ценю это. Есть ли способ, которым я могу просто заставить консоль выписать null в этих полях вместо того, чтобы сделать всю строку нулевой? –

+2

@AlexChumbley использует формат 'firstString ?? «NULL» 'он называется [оператор с нулевым коалесцированием] (http://msdn.microsoft.com/en-us/library/ms173224.aspx), если переменная равна null, она заменяет его тем, что есть после'? ? '. –

+0

Проблема заключается в том, что если мои предположения верны, а значения действительно порождают исключения, их значения не являются «нулями» - они фактически не имеют значения и при проверке на «null» они просто будут пропущены во время выполнения. – aevitas

Смежные вопросы