Java - 错误消息显示不正确

5

这不是一个重大问题,但我不明白为什么会发生这种情况,所以我想在这里发布一下。这是我的代码:

do{
    printMenu();//method to print menu
    try{
        user=input.nextInt();
    }
    catch(InputMismatchException imme)
    {
        System.err.println("Make sure to enter a number.");
        input.next();
        continue;
    }
    switchMenu(user);//method with switch method for user input
}while(1<2);

这段代码本来运行良好,但有一个问题。错误信息请确保输入的是数字有时会在菜单后面显示,有时会在前面显示,有时甚至会在菜单中间显示。以下是程序的输出结果:

1. Book a ticket
2. Cancel a ticket
3. Check how many seats left
4. Print seat map
5. Check price
6. Print ticket
7. Exit

a

1. Book a ticket
2. Cancel a ticket
3. Check how many seats left
4. Print seat map
5. Check price
6. Print ticket
7. Exit

Make sure to enter a number.//Error message after menu

asd//wrong input

Make sure to enter a number.//now error message displays before menu

1. Book a ticket
2. Cancel a ticket
3. Check how many seats left
4. Print seat map
5. Check price
6. Print ticket
7. Exit

asd

1. Book a ticket
2. Cancel a ticket
3. Check how many seats left
Make sure to enter a number.//in the middle now???
4. Print seat map
5. Check price
6. Print ticket
7. Exit

如果这有关系的话,我正在使用Eclipse。 我知道这不是一个大问题,但我很好奇为什么会发生这种情况。


正如建议的那样,我将 System.err 改为了 System.out,现在它可以正常工作了。感谢您的帮助。 - Yulek
2个回答

3
这是因为System.outSystem.err是两个不同的流,可能会缓冲写操作并在不同的时间被刷新(即打印出来)。
很可能会混淆System.outSystem.err,因为我认为System.out使用缓冲输出流进行实现以提高性能,而System.err使用非缓冲流以更快地打印错误消息。
当您在流上显式调用flush()时,可能会观察到更接近您预期的行为,尽管我不确定是否还有竞争条件存在,因为两者最终都将出现在同一个Eclipse控制台中。
话虽如此,我也认为Eclipse控制台可以混合字符串(即使您的代码保证顺序,控制台也可能会给System.err赋予更高的优先级),因此获取可靠的顺序的唯一可靠方法是对两条消息使用相同的输出流。

1

System.errSystem.out是不同的PrintStream,并且都是异步的。如果您快速调用它们,无法预测哪一个会先显示。

如果您真的希望按顺序显示消息,则应使用相同的PrintStreamSystem.errSystem.out或您自己的PrintStream)。


除了为什么整个菜单在不同的方法中,它为什么会有一次在菜单中间打印的情况,这很有道理。 - Yulek
因为两个PrintStream可能同时写入控制台。 - grebesche
哦,我明白了。谢谢你的帮助。 - Yulek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接