方法在返回非 null 值后引发 null 引用异常

Method throws null reference exception after returning non-null value

提问人:lucrativelucas 提问时间:2/20/2012 最后编辑:lucrativelucas 更新时间:2/22/2012 访问量:1389

问:

我有一个服务方法,可以非常简单地获取数据库中所有存储的信息。它使用自动映射器从 EF 映射存储,并返回 StoreDTO(简单 POCO)类型的泛型响应。

问题是这样的:该方法执行得很好,我一路走到最后。中的每个属性都有一个值,没有任何东西是空的。列表中填充了项目,列表中的项目有效,等等。response

但以下代码会在返回后立即引发 NullReferenceException:GetAllStores

ListResponseDTO<StoreDTO> allStores = Services.Stores.Stores.GetAllStores();

编辑:这是调试器的屏幕截图,就在它返回时。您可以在监视窗口中看到这些值看起来是犹太洁食:https://i.stack.imgur.com/NhDsU.png

任何帮助都非常感谢。下面是该方法的代码:

    public static ListResponseDTO<StoreDTO> GetAllStores()
    {
        ListResponseDTO<StoreDTO> response = new ListResponseDTO<StoreDTO>("Get Stores not successful");

        try
        {
            response.Items = new List<StoreDTO>();
            using (DomainEntities db = new DomainEntities(Global.ConnectionString))
            {
                foreach (var IndividualStore in db.Stores)
                {
                    Mapper.CreateMap<Store, StoreDTO>();
                    var IndividualStoreDTO = Mapper.Map<Store, StoreDTO>(IndividualStore);
                    response.Items.Add(IndividualStoreDTO);
                }
            }
            response.Message = "Store(s) retrieved successfully";
            response.Success = true;
        }
        catch (Exception ex)
        {
            Logging.Log("Get All Stores", response.Message + " " + ex.ToString(), Logging.LogPriority.Error, "Store Operations");
        }
        return response;
    }

以下是通用的 DTO 定义:

public class ListResponseDTO<DtoType> : ResponseDTO
{
    public ListResponseDTO()
        : base()
    {
        Items = new List<DtoType>();
    }

    public ListResponseDTO(string defaultMessage)
        : base(defaultMessage)
    {
        Items = new List<DtoType>();
    }

    public List<DtoType> Items;
}

如果您想知道,它有两个属性:ResponseDTO

bool Success

string Message

这里是异常细节,恐怕没有多大帮助:

System.NullReferenceException was unhandled by user code
  Message=Object reference not set to an instance of an object.
  Source=Infinity
  StackTrace:
   at PLM.Infinity.Default.GetDrawersForUser() in C:\Users\jlucas\Documents\Visual Studio 2010\PLM Source Control\Utilities\InfinityInterface\Infinity\Default.aspx.cs:line 96
  InnerException: 
C# 实体框架 自动映射器 NullReferenceException DTO

评论

3赞 John Saunders 2/20/2012
尝试删除 try/catch,看看会发生什么
1赞 Ry- 2/20/2012
@DJKRAZE:该方法是代码的第二个片段。GetAllStores
1赞 Chris Dunaway 2/20/2012
你能发布异常的完整堆栈跟踪吗?
1赞 Chris 2/20/2012
你能显示你打电话的更多背景吗?堆栈跟踪在内部异常中是否有任何内容,或者它实际上是在停止的地方?Services.Stores.Stores.GetAllStores()
2赞 Chris 2/20/2012
大概是带有线的方法吗?另外,我假设从您的屏幕截图中,当您单击该点的单步跳过时,它会返回给父级,这是它立即抛出错误的时候?如果它与您的称呼方式有关,是否有可能看到更多方法来了解它?GetDrawersForUser()ListResponseDTO<StoreDTO> allStores = Services.Stores.Stores.GetAllStores();GetDrawersForUser()

答:

0赞 Oakcool 2/22/2012 #1

你能放一个where子句,这样你就可以只返回你确定它们有所有字段的商店,看看问题是否仍然存在吗?

有时会发生这种情况,因为在数据集的某个地方,您缺少数据,并且在调试期间看不到它。

您还可以再尝试捕获 Mapper 调用框,并查看那里是否发生了某些事情。

这是更多的建议,而不是答案。