我正在测试我的run()函数,以确保它具有方法结尾填充的所有正确的东西。我从我们的数据库中填充了4个字段,两个字符串和两个IEnumerable(字符串)。我的想法是为我从数据库中提取的所有人打印出来。
当我只打印字符串字段时,一切正常。但是,当我尝试添加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: foo@bar.com, correspondance: John, PAM addresses: bar@foo.com, famousPeople: foo, bar, foo
3
4
etc
问题是,总共只有两个人(~425)出现,其余的行只是数字。我不应该至少得到字符串“电子邮件”和“,通信”?看起来Console似乎决定不做任何事情。而且我知道代码必须到达它,因为它在我调用Console.WriteLine()之前打印出整数。
另一方面,每当我要求打印两个字符串字段时,控制台就会在相应的整数后面显示所有425个用户的两个字段。有谁知道这里发生了什么? TIA
答案 0 :(得分: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
失败了,而是你从来没有打过它。
答案 1 :(得分: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
或尾随}
上设置断点并检查firstString
,secondString
的值来查看是否属于这种情况,并查看是否存在'无效。您还可以判断您尝试写入的值之一是否引发了异常。
此外,您应该考虑使用string.Format(string format, params object[] args)
而不是与+
连接。使调试代码变得更加容易。