Сегодня был на собеседовании по Java и завалился на операторе if. Задача была в том, чтобы написать метод, который возвращает второе по величине число из входного массива. Завалился на операторе if при проверке данных. Моя реализация была такой: public int getSecondMaxNumber(int[] numbers) { if (numbers == null || numbers.length < 2) { throw new IllegalArgumentException() } // далее логика получения второго макс. числа } К моему великому удивлению, оказалось, что я допустил грубейшую ошибку. Логику программы следует заключать в блок else, то есть так: public int getSecondMaxNumber(int[] numbers) { if (numbers == null || numbers.length < 2) { throw new IllegalArgumentException() } else { // именно здесь логика получения второго макс. числа } } Зачем весь остальной код писать в блоке else, если при генерировании исключения поток выполнения этого метода прервется? Аналогично, как выяснилось, и в случае, когда вместо генерации исключения просто указывается return. И вообще, после оператора if всегда должен быть else. Насколько я понял из слов технического менеджера, в случае с else JVM выполняет некую оптимизацию. Хотелось бы более подробнее узнать об этом моменте - что за оптимизация и где можно подробнее об этом почитать?
Ответ В дополнение к ответу @VladD: я скомпилировал следующий класс с помощью java 8: public class IfElse { public int getSecondMaxNumber1(int[] numbers) { if (numbers == null || numbers.length < 2) { throw new IllegalArgumentException() } return numbers[1] } public int getSecondMaxNumber2(int[] numbers) { if (numbers == null || numbers.length < 2) { throw new IllegalArgumentException() } else { return numbers[1] } } } Видно, что байткод методов абсолютно одинаковый: $ javap -c IfElse.class Compiled from "IfElse.java" public class IfElse { public IfElse() Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."":()V 4: return public int getSecondMaxNumber1(int[]) Code: 0: aload_1 1: ifnull 10 4: aload_1 5: arraylength 6: iconst_2 7: if_icmpge 18 10: new #2 // class java/lang/IllegalArgumentException 13: dup 14: invokespecial #3 // Method java/lang/IllegalArgumentException."":()V 17: athrow 18: aload_1 19: iconst_1 20: iaload 21: ireturn public int getSecondMaxNumber2(int[]) Code: 0: aload_1 1: ifnull 10 4: aload_1 5: arraylength 6: iconst_2 7: if_icmpge 18 10: new #2 // class java/lang/IllegalArgumentException 13: dup 14: invokespecial #3 // Method java/lang/IllegalArgumentException."":()V 17: athrow 18: aload_1 19: iconst_1 20: iaload 21: ireturn }