检查对象是否为空会引发异常?

时间:2016-10-12 06:54:55

标签: c# enterprise-architect

当执行foreach搜索空值时,它会抛出异常,而不是执行为null-objects指定的代码。

foreach (Requirement requirement in DBRequirements)
{
    if (this.Repository.GetElementByGuid(requirement.Guid) == null)
    {
        hasChanges = true;
        requirement.IsDeleted = true;
    }
}

Repository.GetElementByGuid()是Enterprise Architect的一个功能。我不能修改这个,因此我不得不假设没有找到它会立即抛出异常而不是返回null? (一直无法确定,文档在这方面很缺乏。)我正在考虑使用try catch作为if else,但我想知道是否有人有更好的建议。

基本上应该发生什么;它会检查数据库中的每个需求,如果它的Enterprise Architect对应项仍然存在。如果没有,则DB应将当前需求标记为IsDeleted,如果它不执行任何操作。这是更新数据库的同步周期的一部分。 Guid是Enterprise Architect中的唯一标识符。

编辑:忘了实际提到异常..它在if语句中抛出异常为:

  

NullReferenceException

...在GetElementByGuid(requirement.Guid)上,声明当前上下文中不存在此类元素。

澄清;

直接从数据库中提取DBRequirements并检查是否为空,requirement.Guid不能为null,因为它是数据库中的主键(因而是NOT NULL),数据库记录可能根本就不存在它。 This.Repository在构造函数中声明(在运行时使用调试器进行检查,它也不是null)。

这就是为什么我无法找出抛出异常的原因。有些东西返回null,但是这个foreach中没有任何东西确实有null - 值。

2 个答案:

答案 0 :(得分:3)

尝试使用DBRequirements

Guids
foreach (Requirement requirement in DBRequirements.Where(r => r?.Guid != null))
{
    if (this.Repository.GetElementByGuid(requirement.Guid) == null)
    {
        hasChanges = true;
        requirement.IsDeleted = true;
    }
}

答案 1 :(得分:1)

尝试以下代码..

foreach (Requirement requirement in DBRequirements)
{
    if (requirement != null)
    {
        if (this.Repository.GetElementByGuid(requirement.Guid) == null)
        {
            hasChanges = true;
            requirement.IsDeleted = true;
        }
    }
}