Java: Почему мне требуется инициализировать примитивную локальную переменную?

public class Foo { public static void main(String[] args) { float f; System.out.println(f); } } 

Оператор print вызывает следующую ошибку времени компиляции,

Локальная переменная f может не быть инициализирована

Если примитивы в Java уже имеют значение по умолчанию (float = 0.0f) , почему я должен его определять?


Редактировать:

Итак, это работает

 public class Foo { float f; public static void main(String[] args) { System.out.println(new Foo().f); } } 

Всем спасибо!

Потому что это локальная переменная. Вот почему ему ничего не назначено:

Локальные переменные несколько отличаются; компилятор никогда не присваивает значение по умолчанию неинициализированной локальной переменной. Если вы не можете инициализировать свою локальную переменную там, где она объявлена, не забудьте присвоить ей значение, прежде чем пытаться его использовать. Доступ к неинициализированной локальной переменной приведет к ошибке времени компиляции.

Изменить: почему Java поднимает эту ошибку компиляции? Если мы посмотрим на файл classа IdentifierExpression.java , мы найдем этот блок:

 ... if (field.isLocal()) { LocalMember local = (LocalMember)field; if (local.scopeNumber < ctx.frameNumber && !local.isFinal()) { env.error(where, "invalid.uplevel", id); } if (!vset.testVar(local.number)) { env.error(where, "var.not.initialized", id); vset.addVar(local.number); } local.readcount++; } ... 

Как указано ( if (!vset.testVar(local.number)) { ), JDK проверяет (с помощью testVar ), если назначается переменная ( исходный код testVar где мы можем найти код testVar ). Если нет, он вызывает ошибку var.not.initialized из файла свойств :

 ... javac.err.var.not.initialized=\ Variable {0} may not have been initialized. ... 

Источник

Фактически, компилятор не присваивает значение по умолчанию вашему float f , потому что в этом случае это локальная переменная, а не поле:

Локальные переменные несколько отличаются; компилятор никогда не присваивает значение по умолчанию неинициализированной локальной переменной. Если вы не можете инициализировать свою локальную переменную там, где она объявлена, не забудьте присвоить ей значение, прежде чем пытаться его использовать. Доступ к неинициализированной локальной переменной приведет к ошибке времени компиляции.

Поля classов (не final ) в любом случае инициализируются значениями по умолчанию. Локальных переменных нет.

Не всегда необходимо назначать значение при объявлении поля. Поля, объявленные, но не инициализированные, будут установлены на разумный по умолчанию компилятор.

Итак, (не final ) поле, такое как f в

 class C { float f; } 

будет инициализирован до 0f но локальная переменная f в

 void myMethod() { float f; } 

не будет.

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

Фактически локальные переменные хранятся в стеке. Существует вероятность получить любое старое значение, присутствующее для локальной переменной. Это большая проблема для соображений безопасности. Java говорит, что перед использованием вы должны инициализировать локальную переменную.

Привет, ребята, решение прост. значения, которые хранятся в памяти кучи, инициализируются типом данных на основе компилятора, но локальные переменные хранятся в стеке памяти, поэтому мы должны их инициализировать.

Давайте будем гением компьютера.