JAVA: 使用 try-catch 在正常和调试模式下不同的控制台输出

JAVA: Different console output in normal and debugging modes using try-catch

我是 Java 的新手,正在尝试了解 JVM 的行为。嗯,我有一个简单的代码:

public class MyClass {
    public static void main(String[] args) {
        System.out.println(anotherMethod(5));
        System.out.println(anotherMethod(0));
    }

    private static Integer anotherMethod(int x) {
        try {
            return 10 / x;
        }
        catch (ArithmeticException e) {
            e.printStackTrace();
            return 0;
        }
    }
}

在正常模式下 returns 在控制台中:

2
0
java.lang.ArithmeticException: / by zero
    at MyClass.anotherMethod(MyClass.java:9)
    at MyClass.main(MyClass.java:4)

但是当我在行中放置断点时“System.out.println(anotherMethod(5));”然后在调试模式下逐步执行(Idea中的F8)完成程序returns(我认为这样更正确):

2
java.lang.ArithmeticException: / by zero
    at MyClass.anotherMethod(MyClass.java:9)
    at MyClass.main(MyClass.java:4)
0

拜托,你能解释一下为什么输出结果不同吗?从我的角度来看,它应该是相同的,并且对应于我问题中提到的第二个输出。

在此先感谢您!

嗯,如果你选择“运行”,其实正确的名字是:“运行 without Debugging”。 所以,你 运行 没有调试。如果您想检查代码的每个细节,请使用调试。如果您只想查看结果而不想了解更多细节,请点击“运行 without Debugging”。

您看到的是因为您的代码输出到两个不同的输出流,stdoutstderr。由于缓冲,很难知道系统何时决定根据输出顺序实际输出写入这些流的内容。

解决这个问题最简单的方法是让所有输出都进入一个流。 printStackTrace() 方法采用可选的输出流参数,它允许您指定希望堆栈跟踪输出转到 stdout 而不是 stderr。如果这样做,您将始终按照您期望的顺序获得输出:

public static void main(String[] args) {
    System.out.println(anotherMethod(5));
    System.out.println(anotherMethod(0));
}

private static Integer anotherMethod(int x) {
    try {
        return 10 / x;
    }
    catch (ArithmeticException e) {
        e.printStackTrace(System.out);
        return 0;
    }
}

结果:

2
java.lang.ArithmeticException: / by zero
    at com.example.demo.Test1.anotherMethod(Test1.java:12)
    at com.example.demo.Test1.main(Test1.java:7)
0