2016-10-12 107 views
1

当执行foreach搜索空值时,它会抛出异常而不是执行为空对象指定的代码。检查对象是否为空引发异常?

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,但我想知道是否有人有更好的建议。

基本上应该发生什么;它会检查数据库中的每个需求是否仍然存在。如果没有,DB应该将当前的需求标记为IsDeleted,如果它没有做任何事情需要完成的话。它是更新数据库的同步周期的一部分。 Guid是Enterprise Architect中的唯一标识符。

编辑:忘了其实也谈不上异常..它引发异常的if语句为:

的NullReferenceException

...上GetElementByGuid(requirement.Guid),说明没有这样的元素存在于当前上下文中。

澄清;

DBRequirements从数据库中直接拉出来,并检查是否为空,requirements.Guid不能为null,因为它是数据库中的主键(因此不是NULL),数据库记录可能根本不存在没有它。这个.Repository在构造函数中声明(在运行时用调试器检查,它也不是null)。

这就是为什么我无法找出抛出异常的原因。东西返回到null,但没有任何内容在这个foreach中实际上有一个null值。

+0

什么是例外,它是空引用异常? – mybirthname

+0

也许'this.Repository == null'? – MickyD

+0

或“要求”可能为空。我们需要例外和一些上下文 –

回答

1

尝试下面的代码..

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

试试这个,你只使用DBRequirementsGuids

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

Guid在数据库中不能为空,因为它是主键。 – Ciphra

+1

这也保护案例,如果'require'为空 –

+0

afaik,但我可能在理解这个错误时,'DBRequirements'中的任何'require'都不可能为'null',因为它们被拉直接从数据库(在数据库中,一个记录不能为空,它必须至少有Guid),它被视为只读,因此从未修改过。 – Ciphra