Ошибка компилятора в том, что правила языка не дают четкого представления о сфере действия объявления переменных "items".
Например, если у меня есть такой блок кода:
bool isTrue() {
bool returnValue = false;
if (cheese.isGreen()) {
returnValue = true;
}
return returnValue;
}
до боли ясно, что returnValue является допустимой переменной во всем методе.
Если у меня есть такой блок кода:
bool isTrue() {
if (cheese.isGreen()) {
bool returnValue = true;
}
return returnValue;
}
до боли ясно, что returnValue недопустимо за пределами «условия if».
Но если у меня есть такой блок кода:
bool isTrue() {
if (cheese.isGreen())
bool returnValue = true;
return returnValue;
}
неясно, находится ли returnValue в области действия оператора if или returnValue находится в области действия всего метода. Это связано с деталями макета грамматики языка Java. По сути, разрешено объявлять новые переменные в любом блоке (потому что блок четко определяет область действия переменной), но оператор if не содержит блока.
Если вы предполагаете, что Java добавляет блок для вас без вывода сообщений, тогда область действия находится внутри «забытого блока». Если вы предполагаете, что, поскольку нет явного блока для содержания области, область действия переменной находится на том же уровне, что и остальная часть метода. Существует множество аргументов в отношении того, какая точка зрения «более» верна, поэтому вся попытка сделать это запрещена.
Если вам это кажется странным, и вы считаете, что только сумасшедший не будет предполагать, что переменная определена в пределах объема подразумеваемого блока, пожалуйста, помните, что до Java существовали языки, где область действия была бы на уровне тот же уровень, что и оператор возврата. Да, сумасшедшие языки по сегодняшним меркам, но они все же существовали.