A RuntimeException
is thrown in try
block without being caught, while the finally
clause invokes System.exit()
.
public static void main(String[] args) {
try {
Integer.valueOf("NotANumber");
} finally {
System.out.println("finally");
System.exit(0);
}
}
The output is
finally
If System.exit(0)
is removed from finally, then the output is
finally
Exception in thread "main" java.lang.NumberFormatException: For input string: "NotANumber"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:449)
at java.lang.Integer.valueOf(Integer.java:554)
at exception.MyExcepTest.main(MyExcepTest.java:20)
Where "finally" may appears before, after or in between the meesage of NumberFormatException
.
Can anybody explain it?
The finally block will definitely be executed before the main method exits, and the stacktrace is printed by the JVM after that.
Maybe the stacktrace gets printed to System.err, and the two streams get mixed up in your console output in unpredictable ways (since they are produced basically simultaneously).
What happens when you print "finally" to System.err as well?