【问题标题】:Console input waiting when it should not控制台输入不应该等待
【发布时间】:2012-05-09 01:04:15
【问题描述】:

我刚刚开始使用 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 位,而不是以前的 Ubuntu 10.04 32 位。我以同样的方式运行它,没有重新编译,程序运行良好。

任何想法为什么它会这样?

【问题讨论】:

  • 您是否尝试过使用调试器?

标签: java linux input gcj


【解决方案1】:

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

但我认为您的意思是您实际上必须输入两个换行符,一个在 Hello 之后,一个在“等待新输入”行。如果是这样,那就更难解释了。可能是线路终止不兼容问题。

使用标准 JDK 编译和执行会得到您期望的行为。

【讨论】:

    【解决方案2】:

    我使用 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来检查吗?

    【讨论】:

    • 在 Win7 上运行 Netbeans 程序时,我也得到了正确的输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 2015-12-25
    • 2013-11-13
    相关资源
    最近更新 更多