在以前使用相同方法时,对象引用未设置为对象的实例

时间:2012-10-01 07:13:19

标签: c#

我正在使用Visual Studio 2010和c#以及SQL Management studio。

我正在处理邮箱功能。

我写了一个方法,如果用户点击回复按钮,回复内容就是这样..

private string adjustContentForReply(List<Guid> sender)
    {
        string content = string.Empty;
        messageID = (Guid)Session["messageID"];

        //haal de ontvangers uit de database van het bericht
        List<Guid> receivers = m.bussinesCollection.BussinesMessageReceiver.GetReceivers(messageID);

        //pas de inhoud van het bericht aan met de details van het vorige bericht
        content = "<br /><br />----------------------------------------<br />";
        content += "Ontvangen op: " + m.bussinesCollection.BussinesMessageReceiver.GetMessageReceiver(messageID, boxOwner).DateReceived.ToString() + "<br />";
        content += "Onderwerp: " + m.bussinesCollection.BussinesMessage.GetMessageSubject(messageID) + "<br />";
        content += "Van: " + m.bussinesCollection.BussinesPerson.GetFullName(sender[0]) + "<br />";
        content += "Aan: ";

        //Voeg één of meerdere ontvangers toe aan details
        foreach (Guid rec in receivers)
        {
            content += m.bussinesCollection.BussinesPerson.GetFullName(rec);
            if (receivers.Count() > 1)
                content += "; ";
        }
        content += "<br />";
        content += "----------------------------------------<br /><br />";

        //voeg de inhoud van het vorige bericht aan de content
        content += m.bussinesCollection.BussinesMessage.GetMessageContent(messageID);

        return content;
    }

它在行中给我错误

content += "Ontvangen op: " + m.bussinesCollection.BussinesMessageReceiver.GetMessageReceiver(messageID, boxOwner).DateReceived.ToString() + "<br />";
错误的是

对象引用未设置为对象的实例。

GetMessageReceiver()就像这样

public MessageReceiver GetMessageReceiver(Guid msgId, Guid personId)
        {
            var message = from msg in Db.MessageReceivers
                          where msg.MessageID.Equals(msgId) && msg.ReceiverID.Equals(personId)
                          select msg;

          return  message.Count().Equals(1) ? message.First() : null;
        }

当我调试它并获取messageId和BoxOwnerId并在Database中触发查询时,它显示给定组合的两行。

任何人都可以帮助我吗?

嘿问题从那里解决了,现在我可以创建一个回复消息。 但是点击发送按钮页面时,现在会抛出同样的错误。

3 个答案:

答案 0 :(得分:3)

你想拥有

return message.First();

而不是

return  message.Count().Equals(1) ? message.First() : null;

如果有多个结果,您的代码会返回null。你说,你在数据库中有两行代表你提供的ID,所以你得到的是null ...

您应该使用First而不是FirstOrDefault,因为如果您的消息始终返回的引用不是null,则代码的结构只能正常运行。

答案 1 :(得分:1)

如果在该行上出现NullReferenceException:

content += "Ontvangen op: " + m.bussinesCollection.BussinesMessageReceiver.GetMessageReceiver(messageID, boxOwner).DateReceived.ToString() + "<br />";

然后null几乎可以在任何地方。 除非在这种情况下:显然m.bussinesCollection.BussinesMessageReceiver中没有空值,或者你会在几行之前得到错误。

因此GetMessageReceiverDateReceived为空。

如果没有正好1条消息(0或&gt; = 2),你知道你的GetMessageReceiver方法返回null吗?

答案 2 :(得分:0)

您收到错误是因为您没有检查GetMessageReceiver()的返回值。您需要确保GetMessageReceiver无法返回null,或者您需要在使用任何函数之前检查返回值

MessageReceiver receiver = m.bussinesCollection.BussinesMessageReceiver.GetMessageReceiver(messageID, boxOwner);
if (receiver == null)
    // handle error
    return;

content += "Ontvangen op: " + receiver.DateReceived.ToString() + "<br />";