Страницы

Поиск по вопросам

понедельник, 1 октября 2018 г.

Обязательно ли использовать else?

Сегодня был на собеседовании по 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 }

Комментариев нет:

Отправить комментарий