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

C# string.Split即使有效也会创建错误,c#,split,text-files,C#,Split,Text Files,因此,当我检查数组“vetorUtilizadores”是否创建时,我有一段代码应该可以工作,但它不知怎么地使我的字符串“linha”为空,这给了我一个错误:“对象引用未设置为对象”。这是一个屏幕截图:(当然是测试数据) (抱歉,如果我在这篇文章中做错了什么,顺便说一句,这对这些类型的论坛来说是新的。)如果文本文件为空,那么linha=sr.ReadLine()将把变量设置为空。确保文件中有一些文本 如果文本文件为空,linha=sr.ReadLine()会将变量设置为null。确保文件中有一些

因此,当我检查数组“vetorUtilizadores”是否创建时,我有一段代码应该可以工作,但它不知怎么地使我的字符串“linha”为空,这给了我一个错误:“对象引用未设置为对象”。这是一个屏幕截图:(当然是测试数据)


(抱歉,如果我在这篇文章中做错了什么,顺便说一句,这对这些类型的论坛来说是新的。)

如果文本文件为空,那么
linha=sr.ReadLine()
将把变量设置为空。确保文件中有一些文本

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

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

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

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

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

linha = sr.ReadLine();
一旦到达流的末尾,将
linha
设置为
null
。您可以在while循环中正确地检查while(linha!=null),但是在该行运行之前,您必须运行该行

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

行时,它将抛出null引用异常

linha = sr.ReadLine();
一旦到达流的末尾,将
linha
设置为
null
。您可以在while循环中正确地检查while(linha!=null),但是在该行运行之前,您必须运行该行

string[] vetorUtilizadores = linha.Split(';');
它将在
linha
null
时引发null引用异常上次通过循环时,代码首先检查
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(';');
    }
}
string login = @"utilizadores.txt";
var lines = File.ReadLines(login).Select(linha => linha.Split(';'));
或者这种模式:

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(';');
    }
}
string login = @"utilizadores.txt";
var lines = File.ReadLines(login).Select(linha => linha.Split(';'));
请注意,在StreamReader周围添加了使用块的
。这真的很重要

您也可以使用此模式:

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(';');
    }
}
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上

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

上次通过循环时,代码首先检查
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(';');
    }
}
string login = @"utilizadores.txt";
var lines = File.ReadLines(login).Select(linha => linha.Split(';'));
或者这种模式:

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(';');
    }
}
string login = @"utilizadores.txt";
var lines = File.ReadLines(login).Select(linha => linha.Split(';'));
请注意,在StreamReader周围添加了使用
块的
。这真的很重要

您也可以使用此模式:

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(';');
    }
}
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上


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

我建议您检查
linha!=空

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

我建议您检查
linha!=空

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

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

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

现在,在循环条件中读取并检查该行是否为null,因此一旦ReadLine返回null,循环就会停止。

这是因为代码在检查null后读取该行。 试试这个:

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

现在,在循环条件下读取该行并检查其是否为null,因此一旦ReadLine返回null,循环将立即停止。

文本文件utilizadores.txt中是否有任何内容?
StreamReader.ReadLine
返回
null
,如果已到达文件末尾,请尝试将其缩短为while((linha=sr.ReadLine())!=null)调用
sr.ReadLine()后,需要检查
null
因为如果您在文件末尾,它将返回
null
文本文件utilizadores.txt中是否有任何可能的副本?
StreamReader.ReadLine
如果您已到达文件末尾,则返回
null
。尝试将其缩短为while((linha=sr.ReadLine())!=null)调用
sr.ReadLine()
后,您需要检查
null
,因为如果您在文件末尾,它将返回
null
的可能副本,即使文件中有文本,当它到达文件末尾时也将为null。不完全正确。如果到达文件末尾,它将返回null。不正确
StringReader.ReadLine
返回null如果您已到达文件末尾,即使文件中有文本,当它到达文件末尾时也将为null。不完全如此。如果到达文件末尾,它将返回null。不正确
StringReader.ReadLine
如果到达文件末尾,则返回null