2013-07-05 31 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

相关问题