我该如何解决这个空引用错误?
How can I solve this null reference error?
我有一个数组,用户可以在其中填充对象。对象是不同的苏打水。
此模拟器中有一项功能,用户可以选择查找特定的苏打水。我不希望它区分大小写,所以我使用 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");
根据您的代码,您将对象添加到 sodas
。假设您的对象看起来像这样 class:
public class Container
{
public string Name;
}
当你添加一个没有初始化 Name
字段的新对象时,例如:
sodas[0] = new Container();
字段 Name
是 null
。因此,在这种情况下,当您调用 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.
这里有几个解决方案:
- 默认需要初始化
Name
(可能为空字符串)
public class Container
{
public string Name = "";
}
- 您可以在
ToLower
调用之前检查 Name
。
string name = sodas[i].Name;
if (name != null)
{
sodasL = name.ToLower();
// ...
}
您可以通过删除这些行来解决问题:
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
{
//...
}
//...
我有一个数组,用户可以在其中填充对象。对象是不同的苏打水。 此模拟器中有一项功能,用户可以选择查找特定的苏打水。我不希望它区分大小写,所以我使用 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");
根据您的代码,您将对象添加到 sodas
。假设您的对象看起来像这样 class:
public class Container
{
public string Name;
}
当你添加一个没有初始化 Name
字段的新对象时,例如:
sodas[0] = new Container();
字段 Name
是 null
。因此,在这种情况下,当您调用 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.
这里有几个解决方案:
- 默认需要初始化
Name
(可能为空字符串)
public class Container { public string Name = ""; }
- 您可以在
ToLower
调用之前检查Name
。
string name = sodas[i].Name; if (name != null) { sodasL = name.ToLower(); // ... }
您可以通过删除这些行来解决问题:
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
{
//...
}
//...