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);

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

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 位。我以同样的方式运行它并且没有重新编译,并且程序运行良好。

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

4

2 回答 2

1

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

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

使用标准 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 与 Oracle JDK 非常相似,并且可从其包管理器中用于许多发行版。你能用openJDK而不是gcj检查吗?

于 2012-05-08T13:02:08.327 回答