这不是一个重大问题,但我不明白为什么会这样,所以我想我会在这里发布。这是我的代码:
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。 我知道这不是一个大问题,但我很好奇为什么会这样。
答案 0 :(得分:3)
这是因为System.out
和System.err
是两个不同的流,可能会缓冲写操作并在不同时间刷新(即打印出来)。
System.out
和System.err
之间的事情可能会混淆,因为出于性能原因,我假设System.out
使用缓冲输出流来实现System.err
使用非缓冲流实现以更快地打印错误消息。
你可能会观察到一种行为更接近于你在流上明确地呼叫flush()
时所期望的行为,尽管我不确定是否还没有竞争条件,因为两者都将最终在同一个Eclipse控制台中。
话虽如此,我还假设Eclipse控制台具有混合字符串的方法(即使您的代码保证订单,控制台可能会给System.err
更高的优先级),所以只有获得保证订单的可靠方式,恕我直言才会为这两个消息使用相同的输出流。
答案 1 :(得分:1)
System.err
和System.out
不同PrintStream
且都是异步的。没有办法预测哪一个会在另一个之后显示(如果你快速调用它们)。
如果您确实希望按顺序显示消息,则应使用相同的PrintStream
(System.err
,System.out
或您自己的PrintStream
)。