toomanydoubts. Ответов: 1

Локальная переменная не инициализируется при использовании с попробовать поймать, но инициализируется, когда, наконец, используется с уловом . Почему?


public static void main (String args[] )
{
    int a ;
    try 
    {
        a=4 ;
    }
    finally {
    }
    System.out.println (a ) ;
}


Почему это не дает ошибки времени компиляции при использовании finally ? Я не в состоянии понять логику, стоящую за этим . Я понял случай, когда мы используем catch вместо finally, и это дает ошибку времени компиляции . Но почему не здесь ?

Что я уже пробовал:

Я запустил это на IDE Netbeans .

[no name]

"Почему это не дает ошибки времени компиляции", почему вы думаете, что это должно быть?
"Я не в состоянии понять логику", почему бы и нет? Вам уже все объяснили.
Может быть, вам стоит начать учиться проводить исследования самостоятельно, а не задавать вопросы другим? один и тот же вопрос снова и снова и снова
https://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html

Richard MacCutchan

Потому что выражение a=4 не будет выдавать исключение, поэтому оно всегда будет установлено в finally пункт.

Richard MacCutchan

Посмотрите, насколько легче читать, когда код отформатирован правильно, а текст оставлен обычным шрифтом.

1 Ответов

Рейтинг:
8

OriginalGriff

Подумайте об этом: для чего предназначен блок try...catch?
Он ловит исключения и перенаправляет выполнение непосредственно в код блока catch.
Итак, если ваш код выглядит следующим образом:

int a ;
try 
   {
   a=4 ;
   }
catch (Exception ex)
   {
   Console.WriteLine(ex.Message);
   }
Тогда система может "видеть" путь выполнения, где a не инициализируется: когда в задании возникает проблема. Это вряд ли произойдет в вашем примере, но очень может произойти в более сложном случае:
int a ;
try 
   {
   a=GetValue();
   }
catch (Exception ex)
   {
   ...
   }
Если исключение возникает в getValue, значение не установлено.
Использование finally отличается: он не ловит исключение, поэтому либо назначение будет выполнено, либо код после try...finally блок не будет (поскольку исключение не обрабатывается, оно обрабатывается методом более высокого уровня после завершения finally кода).

Это очень похоже на ту же проблему, что и вчера: Почему переменная x должна быть инициализирована при использовании класса inputstreamreader ?[^]