string.Split即使有效也会创建错误

时间:2018-01-05 17:56:06

标签: c# split text-files

所以我有这个代码,当我检查数组" vetorUtilizadores"是创造了,但它以某种方式使我的字符串" linha" null,这给了我一个错误:"对象引用未设置为对象"。这是一个截图:https://imgur.com/a/9LK2p(当然是那个测试数据)

string linha = "";
string login = @"utilizadores.txt";
StreamReader sr = File.OpenText(login);
while(linha != null)
{
    linha = sr.ReadLine();
    string[] vetorUtilizadores = linha.Split(';');
}

(对不起,如果我在这篇文章上做错了什么,对这些类型的论坛有点新鲜。)

6 个答案:

答案 0 :(得分:6)

循环中的 last 时间,代码首先检查null,但找到一个值。然后它从文件中读取并将null返回到linha变量。接下来它会尝试拆分null字符串,这会导致您的错误。最后(假设您捕获异常)它将返回循环的开头  并再次检查null。这次它会找到null并退出循环。

要解决此问题,您需要在检查null之前从文件中读取。您可以使用此模式:

string login = @"utilizadores.txt";
using (StreamReader sr = File.OpenText(login))
{
    string linha = sr.ReadLine();
    while(linha != null)
    {
        string[] vetorUtilizadores = linha.Split(';');
        linha = sr.ReadLine();
    }
}

或这种模式:

string linha = "";
string login = @"utilizadores.txt";
using (StreamReader sr = File.OpenText(login))
{
    while((linha = sr.ReadLine()) != null)
    {
        string[] vetorUtilizadores = linha.Split(';');
    }
}

请注意在StreamReader周围添加using块。这非常重要。

您也可以使用此模式:

string login = @"utilizadores.txt";
var lines = File.ReadLines(login).Select(linha => linha.Split(';'));

最后一个可能最终会让你编写这样的代码:

bool validAccount = lines.Any(x => x[0] == username && x[1] == password);

这里非常好的是,如果您的用户是列表中的第一个人,那么该代码只能读取文件中的第一行。当然,如果它们根本不在列表中,它仍然需要读取整个文件,但至少你有机会节省一些磁盘I / O.

当然,我假设这是学生代码。没有人真正在纯文本文件中保留用户名/密码列表。正确?

答案 1 :(得分:4)

您正在检查null的行值,然后对其进行修改。在文件的末尾它将为null并且您将收到错误。将您的代码更改为:

string linha = "";
string login = @"utilizadores.txt";
StreamReader sr = File.OpenText(login);
while((linha=sr.ReadLine()) != null)
{
   string[] vetorUtilizadores = linha.Split(';');
}

答案 2 :(得分:1)

这种情况正在发生,因为代码在检查null后读取了行。 试试这个:

while((linha = sr.ReadLine()) != null)
{
    string[] vetorUtilizadores = linha.Split(';');
}

现在读取行并在循环条件中检查为null,因此只要ReadLine返回null,循环就会停止。

答案 3 :(得分:0)

该行

linha = sr.ReadLine();
一旦到达流的末尾,

linha设置为null。您在while循环while(linha != null)中正确检查了该行,但在该行运行之前,您运行了行

string[] vetorUtilizadores = linha.Split(';');

linhanull时会抛出空引用异常。

答案 4 :(得分:0)

我建议您检查流的结尾而不是linha != null

while(!sr.EndOfStream)
{
    linha = sr.ReadLine();
    if(!string.IsNullOrWhiteSpace(linha))
    {
        string[] vetorUtilizadores = linha.Split(';');
    }
}

答案 5 :(得分:-5)

如果文本文件为空,linha = sr.ReadLine()会将您的变量设置为null。确保文件中有一些文字。