Подтвердить что ты не робот

Лучший способ проверить нулевые значения в 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...
}
4b9b3361

Ответ 1

Метод 4 самый лучший.

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

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

Ответ 2

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

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

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

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

Предпочитает читать: Короткое замыкание логического оператора Java

Ответ 3

В 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.

Помимо этого... Вы также можете использовать дополнительный класс Guava

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

Ответ 4

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

Ответ 5

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

Метод 3 просто неверен на каждом уровне. Вы знаете, что элемент может быть нулевым, поэтому не исключительная ситуация - это то, что вы должны проверить.

Метод 2 просто усложняет его выполнение.

Метод 1 - это просто метод 4 с дополнительной строкой кода.

Ответ 6

Я бы сказал, что метод 4 является самой общей идиомой из кода, на который я смотрел. Но это всегда кажется мне вонючим. Предполагается, что foo == null совпадает с foo.bar() == false.

Это не всегда мне нравится.

Ответ 7

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

Ответ 8

В Java 7 вы можете использовать Objects.requireNonNull(). Добавьте импорт класса Objects из java.util.

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");
    }
    //...
}

Ответ 9

Если вы управляете вызываемым API, рассмотрите возможность использования Guava Необязательный класс

Подробнее здесь. Измените свой метод, чтобы вернуть Optional<Boolean> вместо Boolean.

Это сообщает вызывающему коду, что он должен учитывать возможность null, вызывая один из удобных методов в Optional

Ответ 10

Как говорили другие, # 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 a good habit either way
if(foo == null){
if(foo =  null){

Ответ 11

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

Ответ 12

Если вы вообще проверите с двойным равным "==", тогда установите флажок null с объектом ref, например

if(null == obj) 

вместо

if(obj == null)

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

Ответ 13

если у вас нет доступа к общедоступной библиотеке apache, возможно, будет работать нормально

if(null != foo && foo.bar()) {
//do something
}

Ответ 14

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

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

Потому что:

  • Легче читать.
  • Это безопасно: foo.bar() никогда не будет выполняться, если foo == null.
  • Это предотвращает неправильную практику, такую ​​как улавливание NullPointerExceptions (большую часть времени из-за ошибки в коде)
  • Он должен выполняться так быстро или даже быстрее, чем другие методы (хотя я думаю, что это почти невозможно заметить).

Ответ 15

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

public void someMethod(SomeClass obj) {
    Objects.requireNonNull(obj, "Validation error, obj cannot be null");
}

Ответ 16

Простая одна строка Код для проверки null:

namVar == null ? codTdoForNul() : codTdoForFul();