3

在 if-else 分支中,我声明了两个具有相同名称的不同 PrintStream 对象。但是,当我稍后使用 PrintStream 对象时,编译器会说它“找不到符号”。为什么它看不到我创建的对象?该对象与声明它的 if-else 分支一起工作。代码如下:

System.out.println("Welcome. Would you like to continue a previous adventure, or begin anew?\n(type: new or old)");
status = scan.nextLine();

if(status.equals("new")) {
    System.out.println("What do you call yourself?");
    name = scan.nextLine();

    System.out.println("And what shall be the title of your saga, after you are gone?");
    game = scan.nextLine();

    System.out.println("Very well. Prepare yourself, for this is the beginning of your end...\n...\n...\nAre you ready?");
    status = scan.nextLine();

    System.out.println("Not that it matters. Let us begin.");
    status = scan.nextLine();

    File file = new File(game + ".txt");
    PrintStream print = new PrintStream(file);
    print.println(name);
    old = false;
} else {
    System.out.println("So you're still alive? What was the title of your tale?");
    game = scan.nextLine();

    File file = new File(game + ".txt");
    Scanner gscan = new Scanner(file);
    String save = "";

    while (gscan.hasNextLine()) {
        save += gscan.nextLine();
        save += "\n";
    }

    System.out.println(save);
    PrintStream print = new PrintStream(file);
    print.println(save);

    old = true;
    name = scan.nextLine();
}

if(old) {

}

print.println("beans");
4

5 回答 5

3

您遇到范围界定问题。如果要在 if-else 语句之外使用它,则需要在 if-else 语句之外声明它。

Java 程序中有不同级别的作用域。范围通常由一组花括号定义。但是,也有公共、私有和受保护的类型,它们允许使用更多的全局变量,而不仅仅是在它们的大括号内。

这些范围中的每一个都可以有自己的变量,这些变量在其他地方是不可用的。

于 2013-03-25T01:32:05.180 回答
3

需要在语句外声明变量,然后if在两个分支中赋值,像这样:

PrintStream print;
if (status.equals("new")) {
    ...
    print = new PrintStream(file);
} else {
    ...
    print = new PrintStream(file);
}

更好的是,你可以在file里面设置if,然后PrintStream在条件之后创建:

if (status.equals("new")) {
    ...
} else {
    ...
}
File file = new File(game + ".txt");
PrintStream print = new PrintStream(file);
于 2013-03-25T01:33:29.370 回答
1

看一下这两段代码:

String s;
if ( foo ) {
 s = "one";
} else {
 s = "two";
}


if ( foo ) {
 String s = "one";
} else {
 String s = "two";
}

在第一个中,s 在 if/else 之后可用。在第二种情况下,s 仅在 {}(if/else 块)中可用。每个块碰巧有一个同名的变量,但它不是同一个变量。而且以后不可用。

于 2013-03-25T01:34:06.873 回答
0

为什么要定义PrintStream print两次?在这种情况下,您只需在if.

于 2013-11-12T17:09:44.350 回答
0

范围内发生的事情留在范围内。

if(some condition)
{
  int x = 10;

}

System.out.println(x);

这将不起作用,因为 x 的范围仅限于 if 块。如果您希望它位于 if 块之外,则在 if 块之外声明它。

于 2013-03-25T01:35:23.720 回答