foreach语句中的空引用错误

时间:2013-08-13 05:47:57

标签: c#

我在下面的代码中得到一个空引用错误:

string artistName =     mov.get_Annotation((int)QTAnnotationsEnum.qtAnnotationArtist);
string albumName =     mov.get_Annotation((int)QTAnnotationsEnum.qtAnnotationAlbum);
string songTitle =     mov.get_Annotation((int)QTAnnotationsEnum.qtAnnotationFullName);
foreach (char c in artistName)
{
    artistName = artistName.Replace("?", "");
    artistName = artistName.Replace("*", "");
    artistName = artistName.Replace("/", "");
    artistName = artistName.Replace(":", "");
}
foreach (char c in albumName)
{
    albumName = albumName.Replace("?", "");
    albumName = albumName.Replace("*", "");
    albumName = albumName.Replace("/", "");
    albumName = albumName.Replace(":", "");
}

我已经从另一个人项目中复制了这个代码,虽然我大部分都知道发生了什么,但我无法弄清楚错误。错误在每个(artistName中的char c)行上。 谢谢你的帮助。

3 个答案:

答案 0 :(得分:6)

首先,这段代码开头不好。迭代字符串没有意义 - 但每次都在其中执行相同的替换。

但是,问题的原因只能是artistName为空 - 当然,其他两个字符串也可能为空。

你可能想要这样的东西:

string artistName = mov.get_Annotation((int)QTAnnotationsEnum.qtAnnotationArtist);
string albumName = mov.get_Annotation((int)QTAnnotationsEnum.qtAnnotationAlbum);
string songTitle = mov.get_Annotation((int)QTAnnotationsEnum.qtAnnotationFullName);

artistName = RemoveSymbols(artistName);
albumName = RemoveSymbols(albumName);

...

private static string RemoveSymbols(string input)
{
    if (input == null)
    {
        return input;
    }
    return input.Replace("?", "")
                .Replace("*", "")
                .Replace("/", "")
                .Replace(":", "");
}

如果找不到任何特定的注释,那么仍然仍然之后有空引用,但它不会引发异常。你只需要弄清楚你想对那些缺失的值做些什么。 (例如,您可能希望使用硬编码的“未知”值,或者可能是空字符串。)

答案 1 :(得分:0)

您可以在删除下面的特殊字符之前添加验证

artistName= RemoveSymbols(artistName);
albumName= RemoveSymbols(albumName);

private static string RemoveSymbols(string input)
{
    if(!String.IsNullOrEmpty(input))
       return input;

    return  Regex.Replace(input, "[?*/:]", string.Empty);
}

现在你不会得到Null reference error但是你需要找到从mov.get_Annotation方法

获得空值的原因

答案 2 :(得分:0)

C#提供了合并运算符??的优势。尝试使用这样:

string artistName = mov.get_Annotation((int)QTAnnotationsEnum.qtAnnotationArtist);
string albumName  = mov.get_Annotation((int)QTAnnotationsEnum.qtAnnotationAlbum);
string songTitle  = mov.get_Annotation((int)QTAnnotationsEnum.qtAnnotationFullName);

artistName = Regex.Replace(artistName ?? "" , @"[\*\:\/\?]" , "");
albumName  = Regex.Replace(albumName  ?? "" , @"[\*\:\/\?]" , "");
songTitle  = Regex.Replace(songTitle  ?? "" , @"[\*\:\/\?]" , "");