Вот такое вот замысловатое название статьи. Небольшая заметка, чтобы не забыть.
Код 1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class Main { public static final int f1() { try { return 1; } finally { return 2; } return 3; // В этой строчке будет ошибка компиляции // из-за того, что эта строка недостижима } public static void main(String[] args) { System.out.println(f1()); } } |
Но если уберём эту строчку, то получим код 2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class Main { public static final int f1() { try { return 1; } finally { return 2; } } public static void main(String[] args) { System.out.println(f1()); } } |
Теперь этот код уже сработает. Причём на экран выведет цифру 2, так как return 2 в finally перезапишет первоначальный результат.
Теперь ещё более сложный вариант:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class Main { public static final int f1(int arg0) { try { int g = 3 / arg0; return 1; } catch (ArithmeticException ae) { return 2; } finally { return 3; } } public static void main(String[] args) { System.out.println(f1(0)); } } |
Здесь уже результатом будет число 3. Сначала при делении на 0 бросается исключение. Мы его перехватываем и возвращаем из функции 2. Затем отрабатывает finally, который переопределяет результат на 3.
Зачем стоит знать подобные штучки? Заковырки наподобие этого очень любят задавать на собеседованиях. В реальной же разработке они вам никогда не пригодятся. Оба кода представляют из себя просто ужасный стиль программирования. Более полезную информацию про try-catch можно прочесть в статье «Java 8 исключения».
> Заковырки наподобие этого очень любят задавать на собеседованиях. В реальной же разработке они вам никогда не пригодятся.
И после этого продолжают нагло врать про «дефицит программистов», не краснея.