Java 使用System.err.println()时的奇怪行为
我认为Java 使用System.err.println()时的奇怪行为,java,stream,system.out,system.err,Java,Stream,System.out,System.err,我认为System.out.println()和System.err.println()之间的区别仅仅在于如何将消息打印到控制台。意思是err打印错误消息(红色),而out打印标准消息。我注意到,它们不像预期的那样相似(例如,错误消息总是在发出消息之前打印出来) 但有一个例子我特别困惑。假设我有一个简单的程序: Scanner scanner = new Scanner(System.in); while (true) { int num = scanner.nextInt();
System.out.println()
和System.err.println()
之间的区别仅仅在于如何将消息打印到控制台。意思是err
打印错误消息(红色),而out
打印标准消息。我注意到,它们不像预期的那样相似(例如,错误消息总是在发出消息之前打印出来)
但有一个例子我特别困惑。假设我有一个简单的程序:
Scanner scanner = new Scanner(System.in);
while (true) {
int num = scanner.nextInt();
if (num > 0) {
System.out.println("All good, bye");
break;
} else {
System.out.println("Number must be possitive!");
System.out.print("New try:");
}
}
输出(来自我的测试):
但是,当我编写了完全相同的代码,并将消息“Number must be positive”更改为使用
System.err.println()
打印时:
输出(来自我的测试):
我搞不懂它是怎么做这些奇怪的指纹的。有人能告诉我我遗漏了什么吗?我想这是因为两个独立的流正在向同一个控制台写入数据
int i = 5;
while (--i>0) {
System.out.println("Number must be possitive!");
System.out.println("New try:");
}
System.out.println("\n\n with two separate streams \n");
i=5;
while (--i>0) {
System.err.println("Number must be possitive!");
System.out.println("New try:");
}
输出:
Number must be possitive!
New try:
Number must be possitive!
New try:
Number must be possitive!
New try:
Number must be possitive!
New try:
with two separate streams
Number must be possitive!
New try:
New try:
Number must be possitive!
Number must be possitive!
New try:
Number must be possitive!
New try:
因为两个流都不同步,所以不能保证它们的写入顺序。我认为这是因为两个单独的流写入同一个控制台
int i = 5;
while (--i>0) {
System.out.println("Number must be possitive!");
System.out.println("New try:");
}
System.out.println("\n\n with two separate streams \n");
i=5;
while (--i>0) {
System.err.println("Number must be possitive!");
System.out.println("New try:");
}
输出:
Number must be possitive!
New try:
Number must be possitive!
New try:
Number must be possitive!
New try:
Number must be possitive!
New try:
with two separate streams
Number must be possitive!
New try:
New try:
Number must be possitive!
Number must be possitive!
New try:
Number must be possitive!
New try:
由于两个流都不同步,因此不能保证它们的写入顺序。我建议在控制台上检查IDE设置。 对我来说,它正好运行得很好: 我使用的代码基本相同:
import java.util.Scanner;
public class Main
{
public static void main(String[] args) {
System.out.print("Enter the number:");
Scanner scanner = new Scanner(System.in);
while (true) {
int num = scanner.nextInt();
if (num > 0) {
System.out.println("All good, bye");
break;
} else {
System.err.println("Number must be possitive!");
System.out.print("New try:");
}
}
}
}
我建议在控制台上检查IDE设置。 对我来说,它正好运行得很好: 我使用的代码基本相同:
import java.util.Scanner;
public class Main
{
public static void main(String[] args) {
System.out.print("Enter the number:");
Scanner scanner = new Scanner(System.in);
while (true) {
int num = scanner.nextInt();
if (num > 0) {
System.out.println("All good, bye");
break;
} else {
System.err.println("Number must be possitive!");
System.out.print("New try:");
}
}
}
}
添加
System.err.flush()
afterSystem.err.println(“数字必须是肯定的!”)
@saka1029它没有帮助这是由IDE引起的问题。如果在命令提示符/终端窗口中运行代码,它将正确打印。当输出需要由另一个程序(如IDE)读取时,不要将输出混用到stdout和stderr。System.out
是缓冲的:System.err
不是。@user207421您确定(总是(偶数?)这样吗?eclipse在这里使用了一个BufferedOutputStream
,对于命令行Java(Java 1.8.0_202)AddSystem.err.flush()也是如此
afterSystem.err.println(“数字必须是肯定的!”)
@saka1029它没有帮助这是由IDE引起的问题。如果在命令提示符/终端窗口中运行代码,它将正确打印。当输出需要由另一个程序(如IDE)读取时,不要将输出混用到stdout和stderr。System.out
是缓冲的:System.err
不是。@user207421您确定(总是(偶数?)这样吗?eclipse在这里使用了一个BufferedOutputStream
,对于命令行Java(Java 1.8.0_202)也是如此