Лучший способ проверки нулевых значений в Java?

Перед вызовом функции объекта мне нужно проверить, не является ли объект нулевым, чтобы избежать выброса NullPointerException.

Как лучше всего это сделать? Я рассмотрел эти методы.
Какая из практик программирования является лучшей для Java?

// Method 1
if (foo != null) {
    if (foo.bar()) {
        etc...
    }
}

// Method 2
if (foo != null ? foo.bar() : false) {
    etc...
}

// Method 3
try {
    if (foo.bar()) {
        etc...
    }
} catch (NullPointerException e) {
}

// Method 4 -- Would this work, or would it still call foo.bar()?
if (foo != null && foo.bar()) {
    etc...
}
Комментарии к вопросу (7)
Решение

Самым лучшим является метод 4..

if(foo != null && foo.bar()) {
   someStuff();
}

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

Комментарии (2)

Последний и лучший. т.е. ЛОГИЧЕСКИЙ И.

  if (foo != null && foo.bar()) {
    etc...
}

Потому что в логическом &&&

не обязательно знать, что является правой стороной, результат должен быть ложным

Предпочтительнее читать :https://stackoverflow.com/questions/8759868/java-logcial-operators-short-circuiting

Комментарии (0)

В Java 8, лучший способ проверить на null:

Objects.isNull(obj) //returns true if the object is null

Objects.nonNull(obj) //returns true if object is not-null

if(Objects.nonNull(foo) && foo.something()) // Uses short-circuit as well. No Null-pointer Exceptions are thrown.

Помимо этого... вы также можете перейти с гуава's Факультативного класса

Уменьшает типологические ошибки, как (объект=значение null), который всегда возвращает true, как описано в предыдущих ответах.

Комментарии (0)
  • Не ловите NullPointerException. Это плохая практика. Лучше убедиться, что значение не является null.
  • Метод №4 сработает. Он не будет оценивать второе условие, потому что в Java есть замыкание (т.е. последующие условия не будут оцениваться, если они не изменяют конечный результат булева выражения). В этом случае, если первое выражение логического AND оценивается как false, последующие выражения оценивать не нужно.
Комментарии (4)

Способ 4 является, несомненно, лучшим, так как он явно указывает, что будет дальше и использует минимум кода.

Способ 3 просто неправильно на каждом уровне. Вы знаете, этот пункт может быть null, поэтому она's не исключительный случай, это'ы, что вы должны проверить.

Способ 2 это просто делает его более сложным, чем он должен быть.

Способ 1-это просто Способ 4 с дополнительной строчки кода.

Комментарии (0)

Я бы сказал, Способ 4 наиболее общие идиомы из кода, что я'вэ посмотрел на. Но это всегда чувствует себя немного вонючий для меня. Предполагается, ФОО == null то же самое как Foo.бар() == ложь.

Это вовсе'т всегда чувствую себя прямо ко мне.

Комментарии (0)

Способ 4-это мой предпочтительный способ. Короткого замыкания && оператор делает код наиболее читабельным. Способ 3, ловя исключение NullPointerException, не одобряется в большинстве случаев, когда простой нуль проверить будет достаточно.

Комментарии (0)

В версии Java 7, Вы можете использовать объекты.requireNonNull(). Добавьте импортобъектовотЯва.утиль.

public class FooClass {
    //...
    public void acceptFoo(Foo obj) {
        //If obj is null, NPE is thrown
        Objects.requireNonNull(obj).bar(); //or better requireNonNull(obj, "obj is null");
    }
    //...
}
Комментарии (3)

Если вы собираетесь проверить с двойным равных с "==" тогда проверить null с ref объект как

if(null == obj) 

вместо

if(obj == null)

потому что если вы ошибетесь один равны, если(объект = значение NULL), то она вернет true (назначение объекта возвращает успех (что 'правда' в стоимость).

Комментарии (0)

Если вы контролируете вызываемый API, рассмотрите возможность использования гуава'факультативный класс S

Подробнее здесь. Изменить способ вернуть необязательный<логическое>вместологическое`.

Об этом информирует вызывающего кода, что он должен учитывать возможность нуль, позвонив по одному из удобных методов необязательный

Комментарии (0)

Как уже сказал #4-лучший способ, когда не используя метод библиотеки. Однако вы всегда должны поставить нуль в левой части сравнения, чтобы убедиться, что вы Дон'т случайно присвоить значение null переменной foo в случае опечатки. В этом случае компилятор будет ловить ошибку.

// You meant to do this
if(foo != null){

// But you made a typo like this which will always evaluate to true
if(foo = null)

// Do the comparison in this way
if(null != foo)

// So if you make the mistake in this way the compiler will catch it
if(null = foo){

// obviously the typo is less obvious when doing an equality comparison but it's a good habit either way
if(foo == null){
if(foo =  null){
Комментарии (0)

Вы также можете использовать StringUtils.isNoneEmpty(" на глаз") для проверки является нулем или пустой.

Комментарии (0)

Мы можем использовать объект.requireNonNull статический метод класса Object. Реализация ниже

public void someMethod(SomeClass obj) {
    Objects.requireNonNull(obj, "Validation error, obj cannot be null");
}
Комментарии (0)

Простой одну строку кода, чтобы проверить на null :

namVar == null ? codTdoForNul() : codTdoForFul();
Комментарии (0)

если вы не имеете доступ к библиотеке Апач Коммонс, следующий, вероятно, будет работать нормально

if(null != foo && foo.bar()) {
//do something
}
Комментарии (3)

Последнее ваше предложение-лучшее.

if (foo != null && foo.bar()) {
    etc...
}

Потому что:

  1. Это легче читать.
  2. Это безопасно : фу.бар() не будет выполняться, если Foo == нуль.
  3. Это предотвращает плохой практики, такие как ловля возникновению исключительных ситуаций типа NullPointerException (большую часть времени из-за ошибки в коде)
  4. Он должен выполняться так же быстро или даже быстрее, чем другими методами (хотя я думаю, что это должно быть почти невозможно заметить).
Комментарии (0)