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()
after
System.err.println(“数字必须是肯定的!”)
@saka1029它没有帮助这是由IDE引起的问题。如果在命令提示符/终端窗口中运行代码,它将正确打印。当输出需要由另一个程序(如IDE)读取时,不要将输出混用到stdout和stderr。
System.out
是缓冲的:
System.err
不是。@user207421您确定(总是(偶数?)这样吗?eclipse在这里使用了一个
BufferedOutputStream
,对于命令行Java(Java 1.8.0_202)Add
System.err.flush()也是如此
after
System.err.println(“数字必须是肯定的!”)
@saka1029它没有帮助这是由IDE引起的问题。如果在命令提示符/终端窗口中运行代码,它将正确打印。当输出需要由另一个程序(如IDE)读取时,不要将输出混用到stdout和stderr。
System.out
是缓冲的:
System.err
不是。@user207421您确定(总是(偶数?)这样吗?eclipse在这里使用了一个
BufferedOutputStream
,对于命令行Java(Java 1.8.0_202)也是如此