控制台输入等待它不应该

时间:2012-05-08 12:37:18

标签: java linux input gcj

我刚刚开始使用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);

这应该只输入一次并打印输入,如下所示:

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 64位,而不是像以前那样使用32位的Ubuntu 10.04。我以同样的方式运行它并且没有重新编译,程序运行正常。

为什么它的表现如此?

2 个答案:

答案 0 :(得分:1)

可能存在冲洗/缓冲问题导致DEBUG 1的输出时间比您预期的要晚。即,println("DEBUG 1")可以在keyboard.nextLine()之前执行,但由于某种原因,输出会在途中被阻止,并且在读取输入之前不会输出。

但我认为你的意思是你实际上必须输入两个换行符,一个在Hello之后,一个在“Waiting for new input”行。如果是这样,这就更难解释了。也许是线路终端不兼容问题。

使用标准JDK进行编译和执行可以提供您期望的行为。

答案 1 :(得分: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与Oracle JDk非常相似,它可以从包管理器中获得许多发行版。你能用openJDK而不是gcj来检查。