未处理的异常:System.ArgumentNullException:值不能为空

问题描述 投票:0回答:1

我正在尝试从C#中的文本文件读取并将每一行分配给特定变量,但出现未处理的异常:System.ArgumentNullException:值不能为null。尝试将字符串转换为SongGenre时出错。

public static void LoadSongs(string fileName)
{
    string title = "a";
    string artist;
    string length;
    string genre;
    TextReader reader = new StreamReader(fileName);
    while (title != null)
    {
        title = reader.ReadLine();
        artist = reader.ReadLine();
        length = reader.ReadLine();
        genre = reader.ReadLine();
        songs.Add(new Song(title, 
                           artist, 
                           Convert.ToDouble(length), 
                           (SongGenre)Enum.Parse(typeof(SongGenre), 
                           genre)));
    }
    reader.Close();
}

文件名是指可以的文本文件。我在这样的循环之外尝试过:

TextReader reader = new StreamReader(fileName);
string title = reader.ReadLine();
string artist = reader.ReadLine();
double length = Convert.ToDouble(reader.ReadLine());
SongGenre genre = (SongGenre)Enum.Parse(typeof(SongGenre), 
                                        reader.ReadLine());
songs.Add(new Song(title, artist, length, genre));

string title1 = reader.ReadLine();
string artist1 = reader.ReadLine();
double length1 = Convert.ToDouble(reader.ReadLine());
SongGenre genre1 = (SongGenre)Enum.Parse(typeof(SongGenre), 
                                         reader.ReadLine());
songs.Add(new Song(title1, artist1, length1, genre1));

并且有效。我还尝试使用Console.WriteLine打印风格,并且该风格正常工作,因此我确保它不为null,但我不知道为什么会收到此错误。

这不是其他问题的重复。该循环无法正常工作,您可以在下面找到如何修复它。

c# enums streamreader
1个回答
0
投票

您由于设置循环的方式而收到异常。您现在检查title为时过早。在最后一次迭代中,所有变量都将为null,并且在尝试解析null字符串时会出现异常。您需要这样的东西。

while (true)
{
    title = reader.ReadLine();
    if (title == null) break;
    artist = reader.ReadLine();
    length = reader.ReadLine();
    genre = reader.ReadLine();
    songs.Add(new Song(title, 
                       artist, 
                       Convert.ToDouble(length), 
                       (SongGenre)Enum.Parse(typeof(SongGenre), 
                       genre)));
}

此示例不完整,因为您可能应该处理输入文件的所有问题。 (例如,如果文件中没有足够的行,或者正在解析的行中没有正确的数据类型,该怎么办)

要自行发现此类问题,您应该调查debugging

© www.soinside.com 2019 - 2024. All rights reserved.