Перед вызовом функции объекта мне нужно проверить, не является ли объект нулевым, чтобы избежать выброса 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...
}
Самым лучшим является метод 4..
if(foo != null && foo.bar()) {
someStuff();
}
будет использовать оценку замыкания, что означает, что она завершается, если первое условие логического И
ложно.
Последний и лучший. т.е. ЛОГИЧЕСКИЙ И.
if (foo != null && foo.bar()) {
etc...
}
Потому что в логическом &&&
не обязательно знать, что является правой стороной, результат должен быть ложным
Предпочтительнее читать :https://stackoverflow.com/questions/8759868/java-logcial-operators-short-circuiting
В 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
, как описано в предыдущих ответах.
NullPointerException
. Это плохая практика. Лучше убедиться, что значение не является null.Способ 4 является, несомненно, лучшим, так как он явно указывает, что будет дальше и использует минимум кода.
Способ 3 просто неправильно на каждом уровне. Вы знаете, этот пункт может быть null, поэтому она's не исключительный случай, это'ы, что вы должны проверить.
Способ 2 это просто делает его более сложным, чем он должен быть.
Способ 1-это просто Способ 4 с дополнительной строчки кода.
Я бы сказал, Способ 4 наиболее общие идиомы из кода, что я'вэ посмотрел на. Но это всегда чувствует себя немного вонючий для меня. Предполагается, ФОО == null то же самое как Foo.бар() == ложь.
Это вовсе'т всегда чувствую себя прямо ко мне.
Способ 4-это мой предпочтительный способ. Короткого замыкания && оператор делает код наиболее читабельным. Способ 3, ловя исключение NullPointerException, не одобряется в большинстве случаев, когда простой нуль проверить будет достаточно.
В версии 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");
}
//...
}
Если вы собираетесь проверить с двойным равных с "==" тогда проверить null с ref объект как
if(null == obj)
вместо
if(obj == null)
потому что если вы ошибетесь один равны, если(объект = значение NULL), то она вернет true (назначение объекта возвращает успех (что 'правда' в стоимость).
Если вы контролируете вызываемый API, рассмотрите возможность использования гуава'факультативный класс S
Подробнее здесь. Изменить способ вернуть необязательный<логическое>вместо
логическое`.
Об этом информирует вызывающего кода, что он должен учитывать возможность нуль, позвонив по одному из удобных методов необязательный
Как уже сказал #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){
Вы также можете использовать StringUtils.isNoneEmpty(" на глаз") для проверки является нулем или пустой.
Мы можем использовать объект.requireNonNull статический метод класса Object. Реализация ниже
public void someMethod(SomeClass obj) {
Objects.requireNonNull(obj, "Validation error, obj cannot be null");
}
если вы не имеете доступ к библиотеке Апач Коммонс, следующий, вероятно, будет работать нормально
if(null != foo && foo.bar()) {
//do something
}
Последнее ваше предложение-лучшее.
if (foo != null && foo.bar()) {
etc...
}
Потому что: