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”。
您看到的是因为您的代码输出到两个不同的输出流,stdout
和 stderr
。由于缓冲,很难知道系统何时决定根据输出顺序实际输出写入这些流的内容。
解决这个问题最简单的方法是让所有输出都进入一个流。 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
我是 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”。
您看到的是因为您的代码输出到两个不同的输出流,stdout
和 stderr
。由于缓冲,很难知道系统何时决定根据输出顺序实际输出写入这些流的内容。
解决这个问题最简单的方法是让所有输出都进入一个流。 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