【问题标题】:Weird behavior when using System.err.println() [duplicate]使用 System.err.println() 时的奇怪行为 [重复]
【发布时间】:2021-06-24 00:20:11
【问题描述】:

我认为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:");
    }
}

输出(来自我的测试):


但是当我编写完全相同的代码并更改消息“数字必须是正数”以使用System.err.println() 打印时:

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.println("Number must be possitive!");之后添加System.err.flush();
  • @saka1029 没用
  • 这是您的 IDE 引起的问题。如果您在命令提示符/终端窗口中运行代码,它将正确打印。当输出需要由另一个程序(如 IDE)读取时,不要将输出混合到 stdout 和 stderr。
  • System.out 被缓冲:System.err 不是。
  • @user207421 你确定是(总是(甚至?))情况吗? eclipse 在这里为 both 使用 BufferedOutputStream - 对于命令行 Java (Java 1.8.0_202) 也是如此

标签: java stream system.out system.err


【解决方案1】:

我建议在控制台方面检查您的 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:");
            
        }
        
    }
    }
}

【讨论】:

    【解决方案2】:

    我认为这是因为两个单独的流写入同一个控制台。

    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:
    

    由于两个流不同步,因此无法保证它们的写入顺序。

    【讨论】:

      猜你喜欢
      • 2020-02-29
      • 2013-01-27
      • 2013-06-28
      • 2015-07-26
      • 2020-04-26
      • 2015-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多