繁体   English   中英

NullReference异常,即使列表项不为空

[英]NullReference exception even though list items are not null

我必须在这里丢失一些东西,但是我似乎有一个List,即使我已经检查并确认不是,它们的项目也被捕获为null

我对ASP.NET MVC项目的单元测试在foreach循环上引发了NullReferenceException ,但是我找不到任何原因,因此我在代码中进行了一些检查。 令我惊讶的是,check语句没有捕获任何空值,但是异常仍然存在。 以下是相关代码:

[HttpPost]
[ValidateAntiForgeryToken]
public PartialViewResult CreateSimilar(int rebateId, List<AddressInput> addresses, bool recdResults = false)
{
    List<RebateHeader> newRebates = new List<RebateHeader>();
    RebateHeader entity = null;

    int newId = -1;

    if (!recdResults)
    {
        var repo = _db as HeaderRepository;
        List<PotentialDuplicate> allDups = new List<PotentialDuplicate>();

        //A few checks for null objects to illustrate my point-------
        if (addresses == null)
            throw new ApplicationException("Addresses was null"); //Not thrown
        else
            System.Console.WriteLine("Addresses was not null"); //This line is hit

        foreach (AddressInput address in addresses)
        {
            if (address == null)
                throw new ApplicationException("Address was null"); //Not thrown
            else
                System.Console.WriteLine("Address was not null"); //This line is hit
        }

        var test = addresses[0];
        System.Console.WriteLine(test.City); //This line returns a value
        System.Console.WriteLine(test.State); //This line returns a value
        //End checks---------------------------------------------------

        foreach (AddressInput address in addresses) //NullReferenceException THROWN HERE
        {
            List<PotentialDuplicate> dups = repo.GetDuplicateAddresses(
                address.Address, address.City, address.State).ToList();
            if (dups.Count > 0)
            {
                allDups.AddRange(dups);
            }
        }

        if (allDups.Count > 0)
        {
            return PartialView("_AddressDialogPotentialDup", allDups);
        }
    }
    . . . //Additional code truncated
    return PartialView("_IndexNoPager", model);
}

我必须在这里丢失一些东西,但是我没有看到它。 有任何想法吗?

作为进一步的参考,这是失败的单元测试:

[Test]
public void CreateSimilar_Adds_1_New_Record()
{
    EntryController controller = new EntryController(repository);
    List<AddressInput> addresses = new List<AddressInput> 
    {   
        new AddressInput 
    { 
        Address = "Duplicate St.", City = "Testville", State = "MN", 
        ClosingDate = null, Quarter = "115" 
    }
    };

    controller.CreateSimilar(1, addresses); //Unit test FAILS HERE

    Assert.AreEqual(4, repository.GetAll().Count());
    Assert.AreEqual(1, repository.Added.Count);
    Assert.AreEqual("Test Duplicate 1", repository.Added[0].Address);
}

更新:为响应下面的评论,这是我的GetDuplicateAddresses代码:

public IEnumerable<PotentialDuplicate> GetDuplicateAddresses(
    string address, string city, string state)
{
    var result = new List<PotentialDuplicate>();

    using (SqlCommand cmd = new SqlCommand("dbo.GetDuplicateAddresses", (SqlConnection)this.Database.Connection))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@Address", address);
        cmd.Parameters.AddWithValue("@City", city);
        cmd.Parameters.AddWithValue("@State", state);

        cmd.Connection.Open();
        using (var reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
        {
            while (reader.Read())
            {
                result.Add(new PotentialDuplicate
                {
                    OrigAddress = address,
                    RebateIdMatch = reader.GetInt32(0),
                    Address = reader.GetString(1),
                    MatchType = reader.GetString(2)
                });
            }

            return result;
        }
    }
}

这是我在单元测试中使用的存根:

public IEnumerable<PotentialDuplicate> GetDuplicateAddresses(
    string address, string city, string state)
{
    var result = new List<PotentialDuplicate>();
    return result;
}

在做dups.Count()> 0之前,我将检查“ dups”是否为空。

事实证明,问题出在这个演员上:

var repo = _db as HeaderRepository;

我必须重构一些其他代码,并且如果将来有类似的问题,我会稍稍更改此行以引发InvalidCastException

var repo = (IHeaderRepository)_db;

我什至没有想到要检查这一点,因为编译器将foreach循环突出显示为异常的位置。 感谢Tim Southard和thepirat000指出循环内的代码块可能导致编译器引发异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM