在调用对象的函数之前,我需要检查对象是否为null,以避免抛出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...
}
答案 0 :(得分:58)
方法4最好。
if(foo != null && foo.bar()) {
someStuff();
}
将使用short-circuit evaluation,这意味着如果logical AND
的第一个条件为假,则结束。
答案 1 :(得分:11)
最后也是最好的一个。即逻辑和
if (foo != null && foo.bar()) {
etc...
}
因为在逻辑&&
没有必要知道右手边是什么,结果必须是假的
答案 2 :(得分:7)
在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的Optional Class
减少类似(obj=null)
这样的类型错误,如前面的答案所述,它总是返回true
。
答案 3 :(得分:5)
NullPointerException
。这是一种不好的做法。最好确保该值不为空。答案 4 :(得分:4)
方法4是最好的,因为它清楚地表明会发生什么并使用最少的代码。
方法3在每个级别上都是错误的。你知道这个项目可能是空的,所以这不是一个特殊的情况,你应该检查它。
方法2只是让它变得比它需要的更复杂。
方法1只是方法4,带有额外的代码行。
答案 5 :(得分:2)
在 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");
}
//...
}
答案 6 :(得分:2)
方法4是我首选的方法。 && amp;的短路运算符使代码最具可读性。方法3,捕获NullPointerException,大多数情况下只需要一个简单的空检查即可。
答案 7 :(得分:2)
我想说方法4是我所看过的代码中最常用的习语。但这对我来说总觉得有点臭。它假设foo == null与foo.bar()== false相同。
这对我来说并不总是合适。
答案 8 :(得分:1)
如果您控制被调用的API,请考虑使用Guava's Optional class
更多信息here。更改您的方法以返回Optional<Boolean>
而不是Boolean
。
通过调用Optional
答案 9 :(得分:1)
正如其他人所说,#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){
答案 10 :(得分:1)
您还可以使用StringUtils.isNoneEmpty("")
检查为空或空。
答案 11 :(得分:1)
如果你要用双等号检查&#34; ==&#34;然后使用对象引用检查null
if(null == obj)
而不是
if(obj == null)
因为如果你错误输入单个等于if(obj = null)它将返回true(赋值对象返回成功(这是&#39; true&#39; in value)。
答案 12 :(得分:0)
如果您无法访问commons apache库,则以下内容可能正常
if(null != foo && foo.bar()) {
//do something
}
答案 13 :(得分:0)
你最后的提议是最好的。
if (foo != null && foo.bar()) {
etc...
}
由于:
答案 14 :(得分:0)
我们可以使用Object类的Object.requireNonNull静态方法。实施如下
public void someMethod(SomeClass obj) {
Objects.requireNonNull(obj, "Validation error, obj cannot be null");
}
答案 15 :(得分:0)
简单的一行检查null的代码:
namVar == null ? codTdoForNul() : codTdoForFul();
答案 16 :(得分:0)
对于 java 11+,您可以使用 Objects.nonNull(Object obj)
if(nonNull(foo)){
//
}
答案 17 :(得分:0)
public <T, U> U defaultGet(T supplier, Function<T, U> mapper, U defaultValue) {
return Optional.ofNullable(supplier).map(mapper).orElse(defaultValue);
}
如果你喜欢函数式编程,你可以创建这个函数