У меня была эта точная проблема, она была вызвана литералом массива 20 элементов. Пришлось переключиться на другой синтаксис. Довольно глупо.
Метод 4 является лучшим.
if(foo != null && foo.bar()) {
someStuff();
}
будет использовать оценку короткого замыкания , что означает, что оно заканчивается, если первое условие logical AND
ложно.
Простой однострочный код для проверки на ноль:
namVar == null ? codTdoForNul() : codTdoForFul();
Мы можем использовать статический метод Object.requireNonNull класса Object. Реализация ниже
public void someMethod(SomeClass obj) {
Objects.requireNonNull(obj, "Validation error, obj cannot be null");
}
если у вас нет доступа к библиотеке Apache commons, вероятно, будет работать следующее
if(null != foo && foo.bar()) {
//do something
}
Ваше последнее предложение - лучшее.
if (foo != null && foo.bar()) {
etc...
}
Потому что:
Вы также можете использовать StringUtils.isNoneEmpty("")
для проверки, является нулевым или пустым.
Если вообще вы собираетесь проверять с двойным равным «==», тогда проверяйте нуль с помощью объекта ref, например,
if(null == obj)
вместо
if(obj == null)
, потому что если вы неправильно набрали одинаковое равное if (obj = null) вернет true (присвоение объекта возвращает успех (значение true).
Если вы управляете вызываемым API, рассмотрите возможность использования необязательного класса Guava
Подробнее здесь . Измените свой метод, чтобы он возвращал Optional<Boolean>
вместо Boolean
.
Это сообщает вызывающему коду, что он должен учитывать возможность нулевого значения, вызывая один из удобных методов в Optional
Я бы сказал, что метод 4 является наиболее общей идиомой из кода, который я рассмотрел. Но это всегда кажется мне немного вонючим. Предполагается, что foo == null совпадает с foo.bar () == false.
Это не всегда кажется мне правильным.
Метод 4, безусловно, лучший, поскольку он четко указывает, что произойдет, и использует минимум кода.
Метод 3 просто неправильный на каждом уровне. Вы знаете, что предмет может быть нулевым, поэтому это не исключительная ситуация, это то, что вы должны проверить.
Метод 2 только делает его более сложным, чем нужно.
Метод 1 - это просто метод 4 с дополнительной строкой кода.
Как уже говорили другие, # 4 - лучший метод, когда не используется библиотечный метод. Тем не менее, вы всегда должны ставить null в левой части сравнения, чтобы случайно не назначить 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){
В Java 8 лучший способ проверки на нулевое значение:
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 - мой предпочтительный метод. Короткое замыкание & amp; & amp; Оператор делает код наиболее читабельным. Метод 3, Catching NullPointerException, не одобряется в большинстве случаев, когда достаточно простой нулевой проверки.
NullPointerException
. Это плохая практика. Лучше убедиться, что значение не равно нулю. Последний и лучший. т.е. ЛОГИЧЕСКОЕ И
if (foo != null && foo.bar()) {
etc...
}
Поскольку в логическом &&
нет необходимости знать, что такое правая часть, результат должен быть false
Предпочитают читать: Короткое замыкание логического оператора Java
В 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");
}
//...
}