NullReferenceException有时只会被抛出?

时间:2016-04-21 10:29:49

标签: c# asp.net .net visual-studio

我有2个文本文件,test1.txttest2.txttest2.txt实际上是test1.txt的副本。

我想编写一些允许textbox从任一文本文件中读取值的代码,这样如果其中一个文本文件为空,它就可以从另一个文本文件中读取值和副本反之亦然。

我首先通过手动清空test1.txt的内容来测试我的代码,然后清空test2.txt的内容,这些内容完美无缺,因为textbox上总会出现一个值。但是,当两个文本文件同时包含内容时,每当我尝试执行它时都会抛出NullReferenceException

如果我问,请不要介意,因为我可能听起来很愚蠢,但是因为这两个文件都不是空的,这就是为什么抛出这个异常的原因?关于NullReferenceException,我已阅读此post,但我不明白我的错误属于哪个类别。

这是文本文件的示例:

^ Michael Johnson^  ^ michaelj^ ^ ^ ^ ^ ^ ^ ^ ^ ^  ^ ^ ^ michaeljohnson@example.com^ ^ 123456^ ^ ^ 123456^ ^ ^ ^ ^ ^ ^ 

这是我的代码:

using System.IO;



Log = @"C:\logs\submission\test1.txt";
Log2 = @"C:\logs\submission\test2.txt";

if (!File.Exists(Log))
{
    File.Create(Log).Dispose();
}

if (!File.Exists(Log2))
{
    File.Create(Log2).Dispose();
}

FileStream fs1 = new FileStream(Log, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
FileStream fs2 = new FileStream(Log2, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);

var sr1 = new StreamReader(fs1);
var sr2 = new StreamReader(fs2);

while (!sr1.EndOfStream || !sr2.EndOfStream)
{
    if (new FileInfo(Log).Length != 0)
    {
        var line1 = sr1.ReadLine();
        var values1 = line1.Split('^');

        if (values1[3].ToString().Trim() == User.Identity.Name.)
        {
            number = values1[18].ToString().Trim();
        }

        if (!(values1[3].ToString().Trim().Contains(User.Identity.Name)))
        {
            unregisteredUser = User.Identity.Name;
        }
    }

    else
    {
        if (new FileInfo(Log2).Length != 0)
        {
            var line2 = sr2.ReadLine();
            var values2 = line2.Split('^');

            if (values2[3].ToString().Trim() == User.Identity.Name)
            {
                number = values2[18].ToString().Trim();
            }

            if (!(values2[3].ToString().Trim().Contains(User.Identity.Name)))
            {
                unregisteredUser = User.Identity.Name;
            }
        }
    }
}

sr1.Close();
sr2.Close();
fs1.Close();
fs2.Close();

这是抛出异常的确切位置:

var values1 = line1.Split('^');

2 个答案:

答案 0 :(得分:0)

如果两个文件都包含以下内容:  if(new FileInfo(Log).Length!= 0)和这个  if(new FileInfo(Log2).Length!= 0)

是真的。 如果一个文件流结束,但另一个仍然有东西要读 这将导致在到达流上的Readline,因此不会返回字符串,但为null。 之后,您尝试在此现有值上访问Split,这会使您的程序最终失败。

答案 1 :(得分:-1)

所以你想从具有给定用户名的两个文件中提取数字值?

我使用这个更易读的LINQ查询:

var numbers = File.ReadLines(Log).Concat(File.ReadLines(Log2))
 .Select(l => l.Split('^'))
 .Where(fields => fields.Length >= 19 
    && fields[3].Trim().Equals(User.Identity.Name, StringComparison.InvariantCultureIgnoreCase))
 .Select(fields => fields[18].Trim());

string number = numbers.FirstOrDefault(); 
string unregisteredUser = number == null ? User.Identity.Name : null;