3

if-elseブランチで、同じ名前の2つの異なる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プログラムには、さまざまなレベルのスコープがあります。スコープは通常、中括弧のセットで定義されます。ただし、中括弧内だけでなく、より多くのグローバル変数を使用できるようにするpublic、private、およびprotectedタイプもあります。

これらの各スコープは、他の場所では使用できない独自の変数を持つことができます。

于 2013-03-25T01:32:05.180 に答える
3

ステートメントの外で変数を宣言してからif、次のように2つのブランチに割り当てる必要があります。

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

次の2つのコードを見てください。

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


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

最初のものでは、sはif/elseの後に使用できます。2番目の例では、sは{}(if / elseブロック)内でのみ使用できます。各ブロックにはたまたま同じ名前の変数がありますが、同じ変数ではありません。そして、それは後で利用できなくなります。

于 2013-03-25T01:34:06.873 に答える
0

スコープで発生したことは、スコープ内にとどまります。

if(some condition)
{
  int x = 10;

}

System.out.println(x);

xのスコープはifブロックまでしか制限されないため、これは機能しません。ifブロックの外側に配置する場合は、ifブロックの外側で宣言します。

于 2013-03-25T01:35:23.720 に答える
0

PrintStream printなぜ2回定義するのですか?この場合、の外で一度だけ定義する必要がありますif

于 2013-11-12T17:09:44.350 に答える