try/catch вместо if null

400
26 декабря 2016, 23:46

Часто бувает несколько и больше аргументов в условии которые необходимо проверить на null. Мне надоело перечислять if(a!=null && b!=null || c!=null) и т.д. Я стал просто обрамлять в try/catch и если что-то не так то просто вывожу сообщение, что одно из условий отсутствует. Понятно что в некоторых случаях необходимо знать, что я получаю и приходится использовать if.

Но все же является такая практика с t/c нормальной?

Answer 1

Примените что-то подобное:

private boolean isNull(Object... objects) {
    if (objects != null) {
        for (Object object : objects) {
           if(object==null)
              return true;
        }
    }
    return false;
}

//использование
if(isNull(a, b, c))
   //blah-blah
Answer 2

Конструкция try/catch обходится дороже. Приведу тест замера времени для 1000000000 вызовов методов проверяющих аргумент на null явно и в попытке и выведу результат замера в консоль:

public class Test {
    public static void main(String[] args) {
        long start, end;
        start = System.currentTimeMillis();
        for (int i = 0; i < 1000000000; i++)
            method(null);
        end = System.currentTimeMillis();
        System.out.println("Check null: " + (end-start));
        start = System.currentTimeMillis();
        for (int i = 0; i < 1000000000; i++)
            methodWithTry(null);
        end = System.currentTimeMillis();
        System.out.println("Try/catch: " + (end-start));
    }
    public static int method(String s) {
        if (s != null) {
            return s.length();
        }
        return 0;
    }
    public static int methodWithTry(String s) {
        try {
            return s.length();
        } catch (NullPointerException e) {
            return 0;
        }
    }
}

Результат:

Check null: 15
Try/catch: 1404
Answer 3

Вопрос не в длине кода. Проверка на null является правильным, хорошим стилем.

Дело в том, что игнорируя проверку на null, вы тем самым подавляете не только эти, ожидаемые вами ошибки, но и все другие потенциальные баги в вашей программе. Проверка параметров вручную позволит приложению упасть в случае, если где-то в другом месте у вас ошибка. Если же вы будете ловить все ошибки скопом, то у вас ошибка в другом месте программы, приводящая к такому же исключению, будет поймана и выдаст ложное сообщение об ошибке.

Answer 4

Однозначно, сказать нельзя, какой вариант лучше. В этой ситуации стоит учитывать несколько моментов.

Исключения, как правило, используются для необычных ситуаций, когда выполнение программы пошло не так, как задумывал программист - получены некорректные параметры, внешние ошибки и пр.

Из этого можно вывести, что:

  1. Если вы пишите код, который будет доступен для вызова сторонними разработчиками, то выкидывание NullPointerException вполне оправдано.
  2. Если этот код, является частью внутреннего компонента, то использование блока try-catch-finally, не вполне оправдано. Получение null, говорит о том, что код некорректен, т.е. такая ситуация ненормальна. В идеале, в процессе отладки null проверяется assert'ами и все подобные ситуации вылавливаются в программе.

Еще один довод против исключений, это более худная производительность. В моем тесте, разница была порядка 2x.

READ ALSO
Как в идее быстро создать GUI с помощью swing?

Как в идее быстро создать GUI с помощью swing?

Как в идее быстро создать GUI с помощью swing?

380
Контекстное меню в Android

Контекстное меню в Android

Доброго всем времени суток!

394
Разница между java.internal.org.xml&hellip; и org.xml

Разница между java.internal.org.xml… и org.xml

IDEA предлагает импорт javainternal

342