Java – amazing output of try / catch / finally?
See English answers > behavior of return statement in catch and finally 6
public static void main(String[] args) { System.out.println(catcher()); } private static int catcher() { try { System.out.println("TRY"); thrower(); return 1; } catch (Exception e) { System.out.println("CATCH"); return 2; } finally { System.out.println("FINALLY"); return 3; } } private static void thrower() { throw new RuntimeException(); }
I want to see this in the output:
TRY CATCH FINALLY 2
But surprisingly, the output is:
TRY CATCH FINALLY 3
I'm confused. Where to return the 2 declaration? Is the final return a bad practice?
Solution
In § 14.1 of jse7 language specification, return statement is defined as sudden termination If your finally block completes suddenly (your return), the try block ends for the same reason (as defined in § 14.20.2):
§ 14.1 [...] there is always a relevant reason for sudden completion, which is one of the following: [...] return without value [...] return with given value [...]
§14.20. 2 [...] if the finally block is suddenly completed because of S, the try statement is suddenly completed because of S (and the reason R is discarded) [...] (reason R is the result of capture)