所以我有这个代码,当我检查数组" 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(';');
}
(对不起,如果我在这篇文章上做错了什么,对这些类型的论坛有点新鲜。)
答案 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(';');
当linha
为null
时会抛出空引用异常。
答案 4 :(得分:0)
我建议您检查流的结尾而不是linha != null
:
while(!sr.EndOfStream)
{
linha = sr.ReadLine();
if(!string.IsNullOrWhiteSpace(linha))
{
string[] vetorUtilizadores = linha.Split(';');
}
}
答案 5 :(得分:-5)
如果文本文件为空,linha = sr.ReadLine()
会将您的变量设置为null。确保文件中有一些文字。