0

我在以下代码中收到空引用错误:

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(":", "");
}

我已经从另一个人的项目中复制了这段代码,虽然我基本上明白发生了什么,但我无法弄清楚错误。错误出现在 for each (char c in artistName) 行上。谢谢你的帮助。

4

3 回答 3

6

首先,此代码一开始就不好。遍历一个字符串是没有意义的——但是每次都在其中执行相同的替换。

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

你很可能想要这样的东西:

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(":", "");
}

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

于 2013-08-13T05:51:47.033 回答
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方法中收到空值

于 2013-08-13T06:01:48.383 回答
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  ?? "" , @"[\*\:\/\?]" , "");
于 2013-08-13T06:14:52.020 回答