为什么java虚拟机终止后,java仍在打印?

为什么java虚拟机终止后,java仍在打印?,java,Java,我正在做一个简单的编译器。当代码中出现错误时,我的编译器需要抛出错误并终止。然而,当我的错误代码被打印出来,Java虚拟机被终止时,我仍然从程序中获得输出 要打印错误并终止我正在使用的: System.err.println("Line....) System.err.println("insert message here"); System.exit(0); 这是我在eclipse中运行程序时的输出(不需要): 为变量p输入一个整数 4. 第5行,d=c*d 错误:尚未定义变量c 20

我正在做一个简单的编译器。当代码中出现错误时,我的编译器需要抛出错误并终止。然而,当我的错误代码被打印出来,Java虚拟机被终止时,我仍然从程序中获得输出

要打印错误并终止我正在使用的:

System.err.println("Line....)
System.err.println("insert message here");
System.exit(0);
这是我在eclipse中运行程序时的输出(不需要):

为变量p输入一个整数
4.
第5行,d=c*d
错误:尚未定义变量c
20
这是我在eclipse中通过调试器运行时的输出(这是需要的):

为变量p输入一个整数
4.
20
第5行,d=c*d
错误:尚未定义变量c
我已经检查了我的程序多次,似乎一切都是正确的,我想这可能是显而易见的,因为它在调试器中正确运行

这是我输入到编译器中的代码,第5行中的变量c尚未声明,因此应该会导致错误。但是,变量d的输出应在错误发生之前打印(如调试器):

readp
q=2
d=p*p+q*q
打印d
d=c*d
打印d
我上传我的代码不是很舒服,因为这是课堂作业的一部分,我不希望任何人提交它

我发现,如果运行这段代码,如果运行的次数足够多,就会出现问题:

public class OutputError {

    public static void main(String[] args) {

        for(int i = 0; i < 10; i++) {
            System.out.println(" ");
            System.err.println("System err");
            System.out.println("System out");
        }
    }
}

我假设您正在将数字写入System.out

如果将内容写入不同的流(out和err),则无法保证它们在终端/控制台中的显示顺序

我可以向您保证,您的程序在终止后并没有实际写入内容,但是在您的程序将内容发送到输出流和它实际显示之间存在一些延迟,这就是为什么您的输出在示例中有点混乱的原因


要测试这一点,请将所有内容放入System.out,它们应该以正确的顺序显示。

很难回答您的问题,因为它不包含一个。请将您的问题包括在一个小型但完整的程序中,以演示该问题。如果精简的程序不是特别有用,那也没关系。只要它证明了问题所在,就足够了。考虑硬编码用户输入,或者用罐头结果替换函数调用。@约翰库格曼感谢回复和编辑。下次我会尝试加入一个例子,但答案已经解决了我的问题。再次感谢。很酷,听起来不错。值得一提的是,创建一个最小的可复制示例不仅有助于在这里得到好的答案,而且是一种很好的调试技术。当您有数百行代码时,您可能对正在发生的事情感到模糊。我发现,将我的代码剥离到最低限度会带来清晰性。当您只有5或10行代码时,很容易看到问题所在。我无法告诉你,为一个问题创建MRE的行为多少次让我找到了解决方案,让我完全跳过发布。
System err

System out

System err
System err
System err
System errSystem out

System out

System out

System out


System err
System out

System err
System out

System err
System out

System err
System out

System err
System out