字符串没有在条件中声明?

Mr.*_*amp 4 java variables

这是我用Java编写的第二个脚本,因为我刚刚开始写一本书,所以我为这个不可避免的荒谬问题道歉.

我正在编写一个剧本,在墙上唱"99瓶啤酒",并尝试在循环中的条件中声明一个新的String变量.不幸的是,它不会编译,因为该字符串被认为是未声明的.然后,当我把它拉出条件,但仍然在循环中,它工作正常.我在这里错过了什么吗?

工作方式:

    while (beersLeft >= 0) {
        String sOrNot = "";
        if (beersLeft > 1) {
            sOrNot = "s";
        } else {
            sOrNot = "";
        }
        System.out.println(beersLeft+" bottle"+sOrNot+" of beer on the wall, "+beersLeft+" bottle"+sOrNot+" of beer!");
        System.out.println("Take one down, pass it around, "+beersLeft+" bottle"+sOrNot+" of beer on the wall!");
        System.out.println();

        beersLeft = beersLeft-1;
    }
Run Code Online (Sandbox Code Playgroud)

不工作

    while (beersLeft >= 0) {
        if (beersLeft > 1) {
            String sOrNot = "s";
        } else {
            String sOrNot = "";
        }
        System.out.println(beersLeft+" bottle"+sOrNot+" of beer on the wall, "+beersLeft+" bottle"+sOrNot+" of beer!");
        System.out.println("Take one down, pass it around, "+beersLeft+" bottle"+sOrNot+" of beer on the wall!");
        System.out.println();

        beersLeft = beersLeft-1;
    }
Run Code Online (Sandbox Code Playgroud)

错误:

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - Erroneous tree type: <any>
at ch01.BottlesOfBeer.main(BottlesOfBeer.java:21)
Run Code Online (Sandbox Code Playgroud)

And*_*rew 6

如果在if语句块中定义了String,则它不在范围内.


小智 5

该问题涉及可变范围.在不工作的示例中,您将声明if和else范围内的字符串.那么,当您尝试打印值时,它们超出了范围.

if (beersLeft > 1) {
    String sOrNot = "s";
    // sOrNot scope ends
} else {
    String sOrNot = "";
    // sOrNot scope ends
}
// sOrNot does not exist in this scope.
System.out.println(beersLeft+" bottle"+sOrNot+" of beer on the wall, "+beersLeft+" bottle"+sOrNot+" of beer!");
Run Code Online (Sandbox Code Playgroud)

工作示例有效,因为当字符串在循环的顶部声明时,它在整个事物中具有范围.

while (beersLeft >= 0) {
   // has scope for rest of loop
   String sOrNot = "";
      ....
}
Run Code Online (Sandbox Code Playgroud)

这种行为可能看起来不直观,但它允许您执行以下操作:

for (int i = 0; i < 10; i++) {
  // do something
}
// The previous i is out of scope, so creates a new one
// without having the names "clash"
for (int i = 5; i >= 0; i--) {
  // do something else
}
Run Code Online (Sandbox Code Playgroud)