do-while循环的范围?

在Java中, do-while循环的主体和循环条件不属于同一范围。 所以以下代码将无法编译:

 do { boolean b = false; } while (b); // b cannot be resolved to a variable 

但是这段代码对我有意义。

而且,如果身体和状况在同一范围内,我找不到任何陷阱; 因为正文总是被执行,而Java没有Goto ,所以我不知道如何跳过最外层的do-while体范围中的变量声明。 即使有可能,编译器也总能检测到这种可能性,然后产生编译时错误。

这种行为是否有任何原因(除了将do-while循环保持为do-while相同的格式)? 我很好奇。 感谢您的任何投入!

因为这是Java中定义范围的方式; inside {}是一个新的范围。

IMO对单个构造的特殊情况没有多大意义。

遵循您的逻辑是在第一次使用之前不会定义b情况:

 do { continue; boolean b = false; } while (b); // b cannot be resolved to a variable 

请注意, boolean标志通常是一个很小的代码,尽量避免它们而不是与它们作斗争。

在您的示例中,布尔变量b的作用域为do..while循环的主体。 由于条件检查是在正文外执行的,因此变量超出了范围。 正确的结构将是:

 boolean b = false ; // Or whichever initial value you want do { b = false; } while (b); 
 do { boolean b = false; } while (b); 

因为布尔变量b是局部变量,其范围仅在块内

来自JLS :

每个局部变量声明语句都立即被一个块包含。

这是基本的范围规则。 在一组花括号{}内声明的变量超出括号末尾的范围。 它违反了标准范围规则,编译器检测这种情况将是额外的工作。

如果你想在do-while块里面定义boolean,你可以写出这样的东西。

 do{ boolean b; ... if(b){ break; } }while(otherCondition) //or while(true) 

语句定义和变量在语句块{}之外是不可见的 ,这就是编译器抱怨的原因。

whiledo ... while之间的区别在于do ... while保证至少执行一次,这是一种更简单的JLS写入方式

关于变量的范围,它必须是可见的,根据这些规则或者你得到编译时错误。

 public class DoWhileLoopExample { public static void main(String[] args) { int i=1; do { System.out.println("Do While Loop Example"); } while(i<1); } }