如何解决此空引用错误?

时间:2019-03-27 10:10:14

标签: c# arrays nullreferenceexception linear-search

我有一个数组,用户可以在其中填充对象。物体是不同的苏打水。 该模拟器中有一个功能,用户可以选择查找特定的苏打水。我不希望它区分大小写,所以我使用ToLower()方法。一切正常,直到阵列中的一个点为空。 我收到空引用错误。

我一直在尝试通过使用if语句来解决此问题,但是该变量在其他语句中不可用。

我该如何解决我的问题?

谢谢!

do
{
    name = Console.ReadLine();
    nameL = name.ToLower();

    if (name == "h" || name == "H")
        break;

    for (int i = 0; i < sodas.Length; i++)
    {
        sodasL = sodas[i].Name.ToLower();

        if (name == "h" || name == "H")
        {
            Run();
            break;
        }
        else if (sodas[i] == null)
            Console.WriteLine("Det är tomt på indexet: {0}!", i + 1);//translation: its empty at index..
        else if (sodasL != nameL)
            Console.WriteLine("Drycken hittades inte på indexet: {0}.", i + 1);//translation: Could not find soda at index...
        else if (sodasL == nameL)
        {
            Console.WriteLine("Drycken {0} finns på indexet: {1}.\n", sodas[i].Name, i + 1);//translation: found soda at index...

            Console.WriteLine("Vill du ta bort drycken?");//translation do you want to remove soda?
            Console.WriteLine("[J]a");//yes
            Console.WriteLine("[N]ej");//no
            Console.WriteLine("[G] för nästa {0}.", sodas[i].Name);
            string inmatat = Console.ReadLine();
            if (inmatat == "j" || inmatat == "J")
            {
                amount_bottles--;
                sodas[i] = null;
                Console.WriteLine("Drycken har tagits bort! Sök efter en annan dryck eller [H] för Huvudmenyn");//soda has been removed
                break;
            }
            else if (inmatat == "n" || inmatat == "N")
            {
                Console.WriteLine("Drycken är kvar! Sök efter en annan dryck eller [H] för Huvudmenyn.");//soda has not been removed
                break;
            }
        }
    }
} while (name != "h" || name != "H");

2 个答案:

答案 0 :(得分:1)

根据您的代码,将对象添加到sodas。假设您的对象看起来像此类:

public class Container
{
    public string Name;
}

在添加新对象而未初始化Name字段时,例如:

sodas[0] = new Container();

字段Namenull。因此,在这种情况下,当您致电sodasL = sodas[i].Name.ToLower()时,它看起来像:

string name = sodas[0].Name; // name = null!!!
sodasL = name.ToLower(); // You try to call the method of an object, but the reference is null.

以下是几种解决方案:

  1. 默认情况下,您需要初始化Name(它可以是一个空字符串)。
public class Container
{
    public string Name = "";
}
  1. 您可以在Name通话之前检查ToLower
string name = sodas[i].Name;
if (name != null)
{
    sodasL = name.ToLower();
    // ...
}

答案 1 :(得分:0)

您可以通过删除以下行来解决您的问题:

nameL = name.ToLower();

sodasL = sodas[i].Name.ToLower();

并使用String.Equals进行不区分大小写的比较:

//...
if (sodas[i] == null)
    Console.WriteLine("Det är tomt på indexet: {0}!", i + 1)
else if (!String.Equals(sodas[i], name, StringComparison.OrdinalIgnoreCase))
    Console.WriteLine("Drycken hittades inte på indexet: {0}.", i + 1);
else //Another if is unnecessary
{
    //...
}
//...