''中的错误是什么?环?

时间:2015-01-08 16:36:44

标签: java for-loop

为什么以下引发错误?

for(; 0   ;)     System.out.println("guess");  // or
for(;false;)     System.out.println("guess");  // or
for(; 1   ;)     System.out.println("guess");

但以下运行正常(无限):

for(;true;)      System.out.println("guess");

为什么它适用于true但不适用于false

3 个答案:

答案 0 :(得分:8)

条件(即; s之间的位)必须是布尔值,因此这会立即排除第一个代码段中的第一个和第三个变体。

现在,第二个变量,你已经使用了布尔值,不会编译,因为编译器意识到循环永远不会被输入,因此会发出错误:

Untitled.java:3: error: unreachable statement
        for(;false;)     System.out.println("guess");
                         ^
1 error

请注意,JLS强制要求为无法访问的语句发出错误(请参阅§14.21):

  

如果语句因无法访问而无法执行,则为编译时错误。

     

...

     

如果for语句可以访问且条件表达式不是值为false的常量表达式,则可以访问包含的语句。

答案 1 :(得分:1)

Java在循环头中需要一个布尔值作为第二个参数,它会对语句进行求值,如果语句返回true,则jvm将运行循环体的代码,而不会跳过正文。

0和1显然不是布尔值,也不定义可以评估的语句(如x< y),因为java是一种静态且强类型的语言(与Python或Perl不同),它不能将int转换为布尔值,所以它崩溃了。

编辑:如果您提供" false"作为语句,JVM将注意到永远无法访问循环体,这将导致运行时错误。

答案 2 :(得分:0)

与C不同,在Java中,truefalse对应boolean类型值,其中1和0到int(实际上,在C中没有{ {1}}声明类型,布尔检查是基于整数比较完成的。在Java中,事情是截然不同的。)