Все дело в определенных правилах присваивания.Java позволит вам использовать локальную переменную только в том случае, если можно гарантировать, что переменная была инициализирована.
Рассмотрим эту упрощенную версию вашего кода:
FileReader inputStream; // not initialized here ...
try {
inputStream = new FileReader("In.txt");
// do stuff
} finally {
if (inputStream != null) {
inputStream.close();
}
}
Нет, предположим, что *Конструктор 1006 * не находит файл In.txt
и выдает FileNotFoundException
.Конструктор завершается «ненормально», и никакое значение не присваивается inputStream
.Затем мы приходим к блоку finally
, где мы пытаемся проверить, что inputStream
не является null
.Но в этот момент inputStream
все еще неинициализирован, и Java не позволит нам принять значение неинициализированной локальной переменной, и вы получите ошибку компиляции.
На вид бесполезное присвоение null
дляinputStream
решает проблему, гарантируя, что переменная всегда инициализировалась, когда мы попадаем в блок finally
.
Спецификация языка Java посвящает целую главу указанию правил определенного присваивания;то есть правила, которые использует компилятор, чтобы решить, была ли переменная инициализирована в любой данной точке.Эти правила довольно консервативны, и в некоторых случаях компилятор скажет, что что-то определенно не назначено, когда человек с большим умом может сделать вывод, что это так.Вы просто должны с этим смириться и иногда добавлять ненужную инициализацию или оператор return
, который никогда не может быть выполнен.