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