It had never even crossed my mind until today, but it turns out that a java finally clause is allowed to overwrite the return value. This example prints 0 rather than 1.

package com.kstruct;

public class Main {

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

	private static int test() {
		try {
			return 1;
		} finally {
			return 0;
		}
	}
}

That could get really confusing in a long / complex / poorly written function…

…and apparently things get worse and worse the more you look into them.