Java 字符串未在条件中声明?

Java 字符串未在条件中声明?,java,variables,Java,Variables,这是我用Java写的第二个脚本,因为我刚刚开始写一本关于它的书,所以我为这个不可避免的荒谬问题道歉 我正在写一个脚本来唱“99瓶啤酒在墙上”,并试图在循环中的条件中声明一个新的字符串变量。不幸的是,它无法编译,因为该字符串被认为是未声明的。然后,当我把它从条件中拉出来,但仍然在循环中时,它工作得很好。我是不是遗漏了什么 工作: while (beersLeft >= 0) { String sOrNot = ""; if (beersLeft >

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

我正在写一个脚本来唱“99瓶啤酒在墙上”,并试图在循环中的条件中声明一个新的字符串变量。不幸的是,它无法编译,因为该字符串被认为是未声明的。然后,当我把它从条件中拉出来,但仍然在循环中时,它工作得很好。我是不是遗漏了什么

工作:

    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;
    }
Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - Erroneous tree type: <any>
at ch01.BottlesOfBeer.main(BottlesOfBeer.java:21)
不工作

    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;
    }
错误:

    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;
    }
Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - Erroneous tree type: <any>
at ch01.BottlesOfBeer.main(BottlesOfBeer.java:21)
线程“main”java.lang.RuntimeException中的异常:不可编译的源代码-错误的树类型: 位于ch01.battlesofbeer.main(battlesofbeer.java:21)
如果在If语句块中定义了字符串,它将不在范围内。

这与作用域有关

当您在if语句之外声明它时,该声明对于整个循环是可见的

但是当您在if语句块中声明它时,它们只能从内部可见。这就是为什么以后会出现未声明的变量错误


一个简单的方法是声明只对声明它的最里面的一组括号可见。

这个问题与变量范围有关。在不起作用的示例中,您正在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
}
for(int i=0;i<10;i++){
//做点什么
}
//上一个i超出范围,因此创建一个新i
//没有名字“clash”
对于(int i=5;i>=0;i--){
//做点别的
}

大括号定义范围。在第二个版本中,变量
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!");
    ...
 }

在第一节中,Sornon
sOrNot
在范围内

这是Java为避免错误而做的事情。这个想法是,如果您只在一个条件语句中为sOrNot赋值,而不在另一个语句中赋值,那么程序可以运行它的进程,并且从未为sOrNot赋值,但它仍将尝试打印。如果发生这种情况,程序将出错

正如其他人所说,这是范围问题,但以我刚才定义的方式,新程序员似乎更容易理解


希望这有帮助

if语句内部声明的字符串sOrNot只属于if语句,不能在其外部使用。

以上
if(beersLeft>1){
put
String sOrNot=“”;
并删除else语句,阅读下面的答案,了解为什么我不需要阅读为什么,只要你说我在内部使用了facepalmed,因为这是明显的冗余。感谢你指出这一点。你还必须从
if
中的sOrNot中删除
字符串,因为这仍然会创建第二个变量名d不在if的作用域内。它看起来确实有点不直观!我习惯于PHP,循环有自己的作用域,但条件会使其冒泡。@Mr.Lavalamp不知道!这当然可以解释您当时的困惑。