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

时间:2013-04-28 01:26:47

标签: java variables

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

6 个答案:

答案 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语句,不能在它之外使用。