If (null check) -else vs try catch (NullPointerException), который более эффективен?
Какая из следующих трех функций более эффективна;
public String getmConnectedDeviceName1() {
if(null != mServerDevice) {
return mServerDevice.getName();
}
else {
return null;
}
}
public String getmConnectedDeviceName2() {
return mServerDevice == null ? null : mServerDevice.getName();
}
public String getmConnectedDeviceName3() {
try{
return mServerDevice.getName();
}
catch(NullPointerException e) {
return null;
}
}
Пожалуйста, ответьте на конкретную приемлемую логику.
Ответы
Ответ 1
Первый намного эффективнее, если mServerDevice
null
. Когда mServerDevice
не null
, оба значения примерно одинаковы. Сравнение с null
- это просто сравнение двух 32-битных целых чисел, которые очень быстро работают. Выбрасывание исключения дорого, потому что должны быть созданы новые объекты и должна быть заполнена трассировка стека.
Оператор транзакции ... ? ... : ...
точно так же эффективен, как и оператор if (...) ... else ...
, потому что оба они переведены в один и тот же байт-код.
Ответ 2
Ну, нет необходимости в "обратном" сравнении (в основном, сдерживание от C, где опечатка может остаться незамеченной, если вы используете плохой компилятор или игнорируете предупреждения) - и условный оператор упрощает работу:
return mServerDevice != null ? mServerDevice.getName() : null;
Или:
return mServerDevice == null ? null : mServerDevice.getName();
Это более читаемо и более эффективно, чем ловить NullPointerException
.
В более сложных сценариях используйте только версию if
. Вы никогда не должны ловить NullPointerException
, если вы не звоните в библиотеку с ошибками, которая бросает ее таким образом, которого вы не можете избежать. Исключения не предназначены для использования таким образом. Они используются для обнаружения ошибок программирования и исключительных внешних условий (таких как отказ IO).
Исключения относительно дороги по сравнению с другими конструкциями потока управления. Однако не делайте этого слишком далеко в другом направлении: некоторые люди избегают исключений, даже если они должны их использовать, из-за ошибочного желания избежать их стоимости. При правильном использовании исключения не должны быть значительной частью вашего профиля производительности: если вы обнаружите, что они занимают много времени, то либо что-то плохое в вашей среде (например, вы постоянно пытаетесь подключиться к базы данных, к которой у вас нет доступа) или вы злоупотребляете исключениями.
Ответ 3
Я определенно согласен с остальными ответами. Чтобы не сказать точно так же, я только скажу вам, что теперь я представляю довольно большой коммерческий код, который был написан около 3 лет, и я не видел никаких заявлений, используя подход try-catch
, который вы упомянули из; хотя было много для проверки null
;)
Ответ 4
Использование предложения try-catch определенно не лучший способ.
Также результаты try-catch при создании экземпляра нового объекта (исключение).
А также, если иное улучшает читаемость.
Таким образом, я бы сказал, что (n!= Null) выполняется быстрее, если у вас много случаев, когда n == null.
Кроме того, n!= Null - сверхбыстрая конструкция.
Ответ 5
Используйте if-else
для ситуаций, в которых вы можете. Броски и исключения для ловли могут быть дорогими и должны использоваться для обработки ошибок (не для логического разветвления).
Ответ 6
Независимо от производительности, я бы предпочел бы форму if-else. Предположим, что mServerDevice не является нулевым, но во время вызова getName() происходит что-то плохое, и он генерирует исключение NullPointerException. Исключительная версия будет молча возвращать null, не регистрируя ошибку.