C# CSharp未处理的异常:System.NullReferenceException:对象引用未设置为对象的实例

C# CSharp未处理的异常:System.NullReferenceException:对象引用未设置为对象的实例,c#,nullreferenceexception,C#,Nullreferenceexception,我在从字符串中搜索子字符串时遇到问题 StreamReader objReader = new StreamReader("D:\\C#\\Mid\\project\\real estate\\store.txt"); string sLine = ""; ArrayList arrText = new ArrayList(); Console.Write("Type the keyword you want to search : "); string search = Console.Rea

我在从字符串中搜索子字符串时遇到问题

StreamReader objReader = new StreamReader("D:\\C#\\Mid\\project\\real estate\\store.txt");
string sLine = "";
ArrayList arrText = new ArrayList();
Console.Write("Type the keyword you want to search : ");
string search = Console.ReadLine();

while (sLine != null)
{
    sLine = objReader.ReadLine();
    int x = sLine.IndexOf(search);
    Console.WriteLine(x);
    if (sLine != null && x != -1)
    {
        Console.WriteLine(x);
        arrText.Add(sLine);
     }
     Console.WriteLine(x);
}
Console.WriteLine("Here");
objReader.Close();

foreach (string sOutput in arrText)
    Console.WriteLine(sOutput);
Console.ReadLine();
我得到的信息是

未处理的异常:System.NullReferenceException:对象引用未设置为 对象的实例


您需要检查sLine是否为null,因为如果没有任何内容可读取,ReadLine()将返回null。

尝试添加
!循环条件中的objReader.EndOfStream

while (sLine != null && !objReader.EndOfStream)
{
.
.
.
}

循环不正确,因为在调用
objReader.ReadLine()
之前,
sLine
不会获得
null
值。相反,您应该将循环更改为以下内容:

using(StreamReader objReader = new StreamReader("file_location"))
{
    do
    {
        sLine = objReader.ReadLine();

        if(sLine != null)
        //do stuff
     }
     while(!objReader.EndOfStream);

 }
我不经常使用do..while循环,但在这种情况下,这可能是一个好主意,因为您需要首先调用ReadLine()来至少开始读取文件。这样,如果您在流的末尾,它将返回NULL并跳过if块,然后中断,因为当它达到post条件时,它将在流的末尾


此外,我知道这只是一个基本示例,但请确保添加错误处理代码,因为这些语句中的大多数都会引发异常。

sLine.IndexOf(search)之前检查sLine是否为null
using(StreamReader objReader = new StreamReader("file_location"))
{
    do
    {
        sLine = objReader.ReadLine();

        if(sLine != null)
        //do stuff
     }
     while(!objReader.EndOfStream);

 }