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

本文关键字:设置 对象 实例 NullReferenceException 未处理 异常 System CSharp 对象引用 | 更新日期: 2023-09-27 18:32:52

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

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();

我得到的消息是

处理的异常:系统。空引用异常:对象引用未设置为 对象的实例。

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

sLine = objReader.ReadLine();

您需要检查 sLine 是否为空,因为如果没有要读取的内容,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 块,然后中断,因为当它到达后置条件时它将位于流的末尾。

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