在Java中,do-while
循环的主体和循环条件不属于同一范围。所以下面的代码不会编译:
do {
boolean b = false;
} while (b); // b cannot be resolved to a variable
但是这段代码确实对我有意义。
另外,如果身体和病情在同一范围内,我找不到任何陷阱;因为正文总是被执行,而Java没有Goto
,所以我不知道如何跳过最外层do-while
正文范围内的变量声明。即使有可能,编译器也总能检测到这种可能性,然后产生编译时错误。
这种行为是否有任何原因(除了将do-while
循环保持为与while
相同的格式)?我很好奇。感谢您的任何投入!
答案 0 :(得分:10)
因为这是Java中定义范围的方式;里面{}
是一个新的范围。
IMO对单个构造的特殊情况没有多大意义。
答案 1 :(得分:10)
在这里遵循你的逻辑是在第一次使用之前不会定义b
的情况:
do {
continue;
boolean b = false;
} while (b); // b cannot be resolved to a variable
请注意,boolean
标志通常是一个很小的代码,尽量避免使用它们,而不是与它们作斗争。
答案 2 :(得分:2)
在您的示例中,布尔变量b
的范围限定为do..while
循环的主体。由于条件检查是在正文外执行的,因此变量超出了范围。正确的结构将是:
boolean b = false ; // Or whichever initial value you want
do {
b = false;
} while (b);
答案 3 :(得分:1)
答案 4 :(得分:0)
这是基本范围规则。在一组花括号{}内声明的变量超出括号末尾的范围。它违反了标准范围规则,编译器检测这种情况将是额外的工作。
答案 5 :(得分:0)
如果你想在do-while块里面定义boolean,你可以写出这样的东西。
do{
boolean b;
...
if(b){
break;
}
}while(otherCondition) //or while(true)
答案 6 :(得分:0)
语句块{}
之外的语句定义和变量不可见,这就是编译器抱怨的原因。
while
和do ... while
之间的区别在于do ... while
保证至少执行一次,这是根据JLS更简单的写入方式
关于变量的范围,根据these rules,它必须是可见的,否则会出现编译时错误。
答案 7 :(得分:0)
public class DoWhileLoopExample {
public static void main(String[] args) {
int i=1;
do {
System.out.println("Do While Loop Example");
} while(i<1);
}
}