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

时间:2013-12-13 04:28:13

标签: c#

服务器堆栈跟踪:

  

在   Tavisca.TravelNxt.Hotel.Core.Controllers.HotelSuppliersController.b__33(PassengerTypeQuantity   passengerInfo)

     

at System.Linq.Enumerable.Any [TSource](IEnumerable 1 source, Func 2   谓词)

代码:

if (passengers == null || passengers.Count == 0)
{
    _serviceStatus.MissingItems.Add(Utility.GetXmlElementORAttributeName(type, property));
    return false;
}
if (passengers.Any(passengerInfo => passengerInfo.Quantity == 0))
{
    _serviceStatus.InvalidItems.Add(Utility.GetXmlElementORAttributeName(type, property));
    return false;
}

4 个答案:

答案 0 :(得分:4)

请试试这个

        if (passengers == null || (passengers != null && passengers.Count == 0))
        {
            _serviceStatus.MissingItems.Add(Utility.GetXmlElementORAttributeName(type, property));
            return false;
        }

        if (passengers.Any(passengerInfo => (passengerInfo == null) || (passengerInfo != null && passengerInfo.Quantity == 0)))
        {
            _serviceStatus.InvalidItems.Add(Utility.GetXmlElementORAttributeName(type, property));
            return false;
        }

答案 1 :(得分:2)

由于错误在linq中,这意味着问题正在线上发生

if (passengers.Any(passengerInfo => passengerInfo.Quantity == 0))

这是因为passengers中的一个或多个元素为空,因此passengerInfo.Quantity部分导致对象未设置为实例异常。

尝试将该行更改为以下内容以查看它是否解决了错误:

if (passengers.Any(passengerInfo => passengerInfo == null || passengerInfo.Quantity == 0))

(虽然当然,这种改变实际上可能掩盖了你有一个空乘客信息对象的真正问题)

答案 2 :(得分:1)

Object reference not set to an instance of an object.表示您有一个null的对象,因此它没有实例化。您可以通过确保对象实际实例化来解决此问题。

有多种方法可以解决这个问题,这取决于您希望应用程序在出现意外行为的情况下执行的操作(null!)。

空对象的示例

如果您要撰写以下内容:

Person filip = null;
Console.WriteLine(filip.Name);

然后第二行会给我们一个Object reference not set to an instance of an object.例外,因为我们实际上现在知道filipnull

那么我们如何解决这个问题呢?

我们可以在打印之前检查它是否为null

Person filip = null;
if(filip != null)
{
    Console.WriteLine(filip.Name);
}

或者,如果我们从另一个metod获取Person,我们可以使用??来确保它不为null,如果是,我们只需创建一个新的这样的:

Person filip = GetFilip() ?? new Person();

这完全取决于你的应用程序中为null时想要做什么。

正如其他人提到的那样,你需要设置一个断点并找到发生错误的 where ,当你发现错误时,查找哪个对象是null并确保它处理得当。< / p>

您的堆栈跟踪中有很好的信息可以引导我们进入LINQ语句。

在您的情况下,您检查if (passengers == null || passengers.Count == 0)但是在下一行if (passengers.Any....)这意味着即使passengers为空,它仍会尝试Any()开启它将引发异常。

也许您只是在寻找else if

答案 3 :(得分:1)

解决方案是检查所有。

if (passengers == null || (passengers != null && passengers.Count == 0))
{
     _serviceStatus.MissingItems.Add(Utility.GetXmlElementORAttributeName(type, property));
     return false;
}

if (passengers.Any(passengerInfo => (passengerInfo == null) || (passengerInfo != null && passengerInfo.Quantity == 0)))
{
    _serviceStatus.InvalidItems.Add(Utility.GetXmlElementORAttributeName(type, property));
    return false;
}