Сегодня был на собеседовании по 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."
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."
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."
Комментариев нет:
Отправить комментарий