Потому что это локальная переменная. Вот почему ему ничего не назначено:
Локальные переменные несколько отличаются; компилятор никогда не присваивает значение по умолчанию неинициализированной локальной переменной. Если вы не можете инициализировать свою локальную переменную там, где она объявлена, убедитесь, что присвойте ей значение, прежде чем пытаться ее использовать. Доступ к неинициализированной локальной переменной приведет к ошибке времени компиляции.
Редактировать: Почему Java вызывает ошибку при компиляции? Если мы посмотрим на файл 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
), если переменная присваивается (Vset
's source code, где мы можем найти testVar
код). Если нет, то возникает ошибка var.not.initialized
из properties file:
...
javac.err.var.not.initialized=\
Variable {0} may not have been initialized.
...
Source
re edit: да, что работает, но продвижение локального поля, чтобы избежать инициализации, может быть не разумным примером :-) – fvu
@fvu, это пример, поэтому он служит какой-то цели. : D – user1329572