为什么BlueJ给我的代码一个“无法访问的语句”错误? [重复]

问题描述 投票:1回答:3

这个问题在这里已有答案:

作为我的APCS课程的一部分,我必须解决已编写的程序中的小问题,以便稍后引用。这部分是关于while循环的,我从来没有学过无法访问的语句,所以我不知道如何修复它。附件是程序的while循环。错误显示在第一个大括号中。

while( false ) {
    //Since the guess doesn't match, determine if it is too low or too high.
    if (userGuess > secretNumber) {
        System.out.print("Guess number " + numGuesses + " is too LOW. ");
    }
    else if (userGuess < secretNumber) {
        System.out.print("Guess number " + numGuesses + " is too HIGH. ");
    }
}
java while-loop
3个回答
4
投票

语言规范的特定部分(至少对于Java 9)是Sec 14.21,它描述了语句被认为无法访问的条件。

特别是:

如果由于无法访问语句而无法执行语句,则会发生编译时错误。

和(强调我的):

如果至少满足下列条件之一,则while语句可以正常完成:

  • while语句是可访问的,条件表达式不是值为true的常量表达式(第15.28节)。
  • 有一个可到达的break语句退出while语句。

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

所以,你的while循环的主体被认为是无法访问的,因为表达式的值是false,因为它是常量。

要修复它,请更改其中任何一个条件;或者删除while循环,因为它无论如何都不会在逻辑上做任何事情。


2
投票

while(false){//...}行永远不会允许代码到达内部if或else语句。

如果while结构中的条件表达式不是常量false,则仅评估if和else语句,这在代码中不是这种情况。

因此,编译器抱怨在当前场景中无法达到if&else语句。

您可以改为使用变量并为其赋予布尔值,如Elliott Frisch先生在其答案中所证明的那样。


0
投票

使用循环结构while ( boolean ),只有在boolean评估为true时才输入循环体。布尔文字false无法求值为true,因此正文是无法访问的代码。

boolean loopControl = false;
while ( loopControl ) { // <-- this is fine ..
   // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.