2013-08-13 3 views
0

я получаю нулевую ссылочную ошибку в коде ниже: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); 
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(":", ""); 
} 

Я скопировал этот код из другого проекта лиц, и хотя я в основном понимаю, что происходит, я не могу понять, ошибка. Ошибка указана для каждой строки (char c in artistName). Спасибо за любую помощь.

+6

'artistName' is' null'. –

+1

Что вы видите, когда вы устанавливаете точку останова на 'string artistName = ...'? –

+0

Я знаю, но как бы это сделать, чтобы имя исполнителя не было нулевым? Мне в основном нужно удалить недопустимые символы, чтобы использовать строки в каталоге. Я нахожусь над моей головой, делая эту программу, но мне это нужно. – Tom

ответ

6

Во-первых, этот код является плохим для начала. Нет смысла перебирать строку, но при этом каждый раз выполнять одну и ту же замену.

Однако причиной вашей проблемы может быть только то, что artistName 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(":", ""); 
} 

Вы будете еще имеют нулевые ссылки после этого, если какой-либо конкретной аннотации не найдено, но это не будет сгенерировано исключение. Вам просто нужно будет решить, что вы хотите сделать с этими недостающими значениями. (Например, вы можете захотеть использовать жёстко прописанные «Неизвестное» значение, или, может быть пустая строка.)

+0

Спасибо, его остановила ошибку, к сожалению, теперь моя программа зависает без ошибок:/ – Tom

+0

@Tom: Предлагаю вам работать над диагностикой, почему это так, а затем задать новый вопрос с соответствующими сведениями, если вы застрять. –

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 метод

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 ?? "" , @"[\*\:\/\?]" , ""); 
Смежные вопросы