这是我用Java编写的第二个脚本,因为我刚刚开始写一本书,所以我为这个不可避免的荒谬问题道歉。
我正在编写一个剧本,在墙上唱“99瓶啤酒”,并尝试在循环中的条件中声明一个新的String变量。不幸的是,它不会编译,因为该字符串被认为是未声明的。然后,当我把它拉出条件,但仍然在循环中,它工作正常。我在这里错过了什么吗?
WORKING:
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;
}
不工作
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;
}
错误:
Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - Erroneous tree type: <any>
at ch01.BottlesOfBeer.main(BottlesOfBeer.java:21)
答案 0 :(得分:6)
如果在if语句块中定义了字符串,则它不在范围内。
答案 1 :(得分: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!");
工作示例有效,因为当字符串在循环的顶部声明时,它在整个事物中都有范围。
while (beersLeft >= 0) {
// has scope for rest of loop
String sOrNot = "";
....
}
这种行为可能看似不直观,但它允许您执行以下操作:
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
}
答案 2 :(得分:3)
这与范围界定有关。
当你在if语句之外声明它时,声明对于整个循环是可见的。
但是当你在if语句块中声明它时,它们只能从内部看到。这就是为什么你以后会得到未声明的变量错误。
一个简单的方法就是声明只对声明它的最内部括号{}
可见。
答案 3 :(得分:3)
大括号定义范围。在第二个版本中,变量sOrNot
未定义,因为它仅在if
语句的范围内定义。
while (beersLeft >= 0) {
if (beersLeft > 1) {
String sOrNot = "s";
} else {
String sOrNot = "";
}
// sOrNot out of scope here - compilation error!
System.out.println(beersLeft+" bottle"+sOrNot+" of beer on the wall, "+beersLeft+" bottle"+sOrNot+" of beer!");
...
}
第一节sOrNot
在范围
答案 4 :(得分:2)
这是Java为避免错误所做的事情。我们的想法是,如果你只在一个条件语句中为sOrNot赋值,而不是在另一个语句中,程序可以运行它的过程,并且永远不会为sOrNot赋值,但它仍然会尝试打印。如果发生这种情况,程序将会出错。
正如其他人所说,它的范围问题,但在我刚刚定义的方式中,新程序员似乎更容易理解。
希望这有帮助!
答案 5 :(得分:0)
在if语句中声明的String sOrNot只属于IF语句,不能在它之外使用。