这是我用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)
小智 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)