1

Java を使い始めたばかりで、コンソール入力が適切に機能するようにしようとしています。コードは次のとおりです。

System.out.println("Write a word: ");
Scanner keyboard = new Scanner(System.in);
System.out.println("DEBUG 1");
str = keyboard.nextLine();
System.out.println("DEBUG 2");
System.out.println(str);

これは、次のように、入力を 1 回だけ受け取り、入力を出力する必要があります。

Write a word: 
DEBUG 1
Hello            //My input
DEBUG 2
Hello            //Output

しかし、これは何が起こるかです:

Write a word: 
Hello            //My input
DEBUG 1
                 //Waiting for new input
DEBUG 2
Hello            //The first input

したがって、どういうわけか、行Scanner keyboard = new Scanner(System.in);で入力を取得しているように思えます。それを変数strに入れます。gcj を使用して、次のコマンドでコンパイルして実行します。

javac hello_world.java
java hello_world

編集:以前のUbuntu 10.04 32ビットの代わりに、Ubuntu 10.04 64ビットを使用して、別のコンピューターでプログラムを実行しようとしました。同じ方法で実行し、再コンパイルしませんでした。プログラムは正常に動作します。

なぜこのように振る舞うのか、何か考えはありますか?

4

2 に答える 2

1

フラッシュ/バッファリングの問題が発生し、DEBUG1が予想よりも遅く出力される可能性があります。つまり、のprintln("DEBUG 1")前に実行できますkeyboard.nextLine()が、何らかの理由で出力が途中で保留され、入力が読み取られるまで出力されません。

ただし、実際には2つの改行を入力する必要があると思います。1つはHelloの後に、もう1つは「Waitingfornewinput」行に入力します。もしそうなら、これを説明するのはもっと難しいです。おそらく、回線終端の非互換性の問題です。

標準のJDKを使用してコンパイルおよび実行すると、期待どおりの動作が得られます。

于 2012-05-08T13:04:32.693 に答える
0

Oracle JDK 6を使用してWindowsで実行されているEclipseでプログラムをチェックしたところ、期待どおりの結果が得られました。

public static void main(String[] args) {
        System.out.println("Write a word: ");
        Scanner keyboard = new Scanner(System.in);
        System.out.println("DEBUG 1");
        String str = keyboard.nextLine();
        System.out.println("DEBUG 2");
        System.out.println(str);
    }

結果 :

Write a word: 
DEBUG 1
hello
DEBUG 2
hello

OpenJDKはOracleJDkによく似ており、パッケージマネージャーから多くのディストリビューションで利用できます。gcjの代わりにopenJDKで確認できますか?

于 2012-05-08T13:02:08.327 に答える