do-while循环的范围?

时间:2011-11-09 17:13:18

标签: java scope

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

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

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

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

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

8 个答案:

答案 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)

do {
    boolean b = false;
}
while (b);

因为布尔变量b是一个局部变量,其范围仅在block范围内
来自JLS

  

每个局部变量声明语句都会立即包含在   一个街区。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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

whiledo ... 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);
    }
}