C# foreach语句中存在Null引用错误
我在以下代码中得到一个空引用错误:C# foreach语句中存在Null引用错误,c#,C#,我在以下代码中得到一个空引用错误: string artistName = mov.get_Annotation((int)QTAnnotationsEnum.qtAnnotationArtist); string albumName = mov.get_Annotation((int)QTAnnotationsEnum.qtAnnotationAlbum); string songTitle = mov.get_Annotation((int)QTAnnotations
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(artistName中的字符c)行上。
谢谢您的帮助。首先,这段代码开头不好。对字符串进行迭代没有意义,但每次都要对其执行相同的替换 但是,问题的原因只能是
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(":", "");
}
如果找不到任何特定的注释,则在此之后仍将有空引用,但它不会引发异常。您只需要确定如何处理这些缺失的值。(例如,您可能希望使用硬编码的“未知”值,或者可能是空字符串。)首先,此代码开头不好。对字符串进行迭代没有意义,但每次都要对其执行相同的替换 但是,问题的原因只能是
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(":", "");
}
如果找不到任何特定的注释,则在此之后仍将有空引用,但它不会引发异常。您只需要确定如何处理这些缺失的值。(例如,您可能希望使用硬编码的“未知”值,或者可能是空字符串。)您可以在删除以下特殊字符之前添加验证
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
方法接收Null值的原因。您可以在删除以下特殊字符之前添加验证
artistName= RemoveSymbols(artistName);
albumName= RemoveSymbols(albumName);
private static string RemoveSymbols(string input)
{
if(!String.IsNullOrEmpty(input))
return input;
return Regex.Replace(input, "[?*/:]", string.Empty);
}
现在您将不会得到空引用错误
,但您需要找到从mov接收空值的原因。get_Annotation
方法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 ?? "" , @"[\*\:\/\?]" , "");
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 ?? "" , @"[\*\:\/\?]" , "");
artistName
为null
。当您在string artistName=…
上设置断点时,会看到什么?我知道,但我该如何做才能使艺术家名称不为null?我基本上需要删除非法字符才能使用目录中的字符串。我正在制作这个程序,但我有点需要它。看看我的artistName
也是null
。当你在string artistName=…
上设置断点时,你会看到什么?我知道,但是我该怎么做才能使artistName不为null?我基本上需要删除非法字符才能使用目录中的字符串。我正在做这个程序,但我有点需要它。也看看我的。谢谢它停止了错误,不幸的是现在我的程序冻结了,没有错误:/@Tom:我建议你研究一下原因,如果你卡住了,再问一个新问题,并提供适当的细节。谢谢它停止了错误,不幸的是,现在我的程序冻结了,没有出现错误:/@Tom:我建议你先诊断一下原因,如果你遇到问题,再问一个新问题,并附上适当的细节。