That's because the finally
block is executed after the catch
clause. Inside your catch
you return x
, and at that point its value is 2, which gets written to the stack as return value. Once finally
overwrites the value of x
with 3, the return value is already set to 2.