If (null check) -else vs try catch (NullPointerException), который более эффективен? - программирование
Подтвердить что ты не робот

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;
        }
    }

Пожалуйста, ответьте на конкретную приемлемую логику.

4b9b3361

Ответ 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, не регистрируя ошибку.