2012-04-23 4 views

ответ

2

Компилятор не может быть уверен, что код внутри блока try будет успешно запущен. В этом случае это всегда будет, но если в блоке try есть дополнительный код, то r = 0 никогда не будет выполняться. В этом случае r неинициализируется, следовательно, ошибка.

Это ничем не отличается, чем если бы вы сказали:

long r; 
if(something) { 
    r = 0; 
} 
return r; 

(где «нечто» почти все, кроме постоянного истинного значения).

+0

Если 'r = 0' не выполняется, не будет ли исключение исключение? – Mehrdad

+0

Возможно, но вы используете переменную, которую компилятор не может определить на 100%, будет инициализирован, поэтому вы получите сообщение об ошибке. Блок try добавляет двусмысленность относительно того, будет ли r инициализирован. Как человек легко определить r будет инициализирован, но ваш компьютер не человек. – JonBWalsh

+0

Если бы существовал блок '__except' (« catch »), я бы понял, так как переменная останется неинициализированной через блок catch ... но я действительно не понимаю, почему это происходит здесь, поскольку AFAIK невозможно для переменная остается неинициализированной. – Mehrdad

0

Потому что long r; создает r, но не инициализируется; он равен нулю.

Поэтому он предупреждает вас, что переменная не инициализирована. В некоторых случаях это вызовет Null Pointers.

+0

Я думал, что сказал «r = 0'? – Mehrdad

0

Добавление это как ответ, как это представляет больший интерес, чем просто комментарий: ошибки никогда не появлялась, пока меченых-заявление: вставляли перед переменным. Удалите связанный ярлык goto &, и нет предупреждения. Это может иметь какое-то отношение к тому, как настройка пространства имен настроена с аналогичным предупреждением C4702, сгенерированным на строке до. Вставка блока goto. MVCE еще предстоит создать, если кто-то заинтересован.

Смежные вопросы