编译器错误是因为语言规则没有明确指出“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 之前的语言中,范围会处于同一级别作为返回语句。是的,按照今天的标准,疯狂的语言,但它们仍然存在。