java - 避免在Java使用“!= null” 语句吗?

  显示原文与译文双语对照的内容
0 0

当我使用Java编程时,我最常用的方法是在使用它之前测试 object!= null 。 这是为了避免 NullPointerException 。 我发现代码非常丑陋,它变得不可读。

是否有一个好的替代方案?

更新: Pan,我的问题不清楚。 如果你想访问这里对象的字段或者方法,我想解决测试每个对象的必要性。 例如:

...
if (someobject!= null) {
 someobject.doCalc();
}
...

在这种情况下,我将避免 NullPointerException, 我不知道如果对象是 null 与否。 所以我的代码被这些测试淹没了。

时间:原作者:35个回答

0 0

如果不允许 null-values

如果你的方法在外部调用,请从以下类似的开始:

public void method(Object object) {
 if (object == null) {
 throw new IllegalArgumentException("...");
 }

在该方法的其余部分,你知道它不是空的。

如果它是一个内部方法( 不是api的一部分),那么只需文档表明它不能为空,就这样。 例如:

public String getFirst3Chars(String text) {
 return text.subString(0, 3);
}

但是,如果你的方法只是传递了值,并且下一个方法通过了 等等,那么它可能会有问题。 在这种情况下,你可能想要检查上面的参数。

如果允许为空

这确实取决于。如果发现我经常这样做:

if (object == null) {
//something
} else {
//something else
}

所以我分支,做两个完全不同的事情。 没有丑陋的代码 Fragment,因为我真的需要根据数据做两个不同的事情。 例如我应该处理输入,还是应该计算一个好的默认值?


我很少使用这种习惯用法" if (object!= null &&.. . """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""。

如果你展示了你通常使用这个习惯用法的例子,你可能会更容易给出例子。

原作者:
0 0

哇,当我们有 57种不同的方式推荐 NullObject pattern 时,我几乎不想再添加一个答案了,但是我想有一些人对这个问题有兴趣,这个表的7可以为if-not-equal-null逻辑添加 "null-safe处理"—a精简语法。

Alex Miller给出的示例如下所示:

public String getPostcode(Person person) { 
 return person?.getAddress()?.getPostcode(); 
} 

?. 只表示de-reference标识符( 如果它不是空的),否则将表达式的其余部分作为 null 求值。 一些人,比如java一团成员迪克墙和选民Devoxx真的喜欢这个提议,但也反对,理由是它会鼓励更多使用 null 标记值。


更新:官方提案在 Java 7中的null-safe操作符已经在项目中提交。 语法与上面的例子稍有不同,但它是相同的概念。


更新: null-safe运营商提议did未将它的变成项目币。 因此,你将不会在 Java 7中看到这个语法。

原作者:
0 0

如果不允许未定义的值:

你可以配置你的IDE来警告你潜在的空取消引用。 比如 中的,参见 。首选项> Java> 编译器> Errors/Warnings/Null 分析

如果允许未定义的值:

如果你想定义一个未定义的值意义的新的api,使用选项模式 ( 可以从函数式语言中熟悉) 。 它具有以下优点:

  • 在API中明确声明输入或者输出是否存在。
  • 编译器强制你处理"未定义"案例。
  • 选项是一个 monad,所以不需要详细的空检查,只需使用 map/foreach/getOrElse 或者类似的组合来安全地使用值 ( 范例) 。

Java 8有一个内置 Optional 类( 推荐推荐) ;对于早期版本,存在库替代方案,例如 GuavaOptional或者 FunctionalJavaOption 。 但是像许多functional-style模式一样,使用 Java ( 8 ) 中的选项会导致相当多的样板文件,这可以减少使用较详细的JVM语言,比如 Scala 或者 Xtend 。

如果你需要处理一个api可能会返回null,你不能用java做得。 Xtend和Groovy有猫王操作符?:null-safe反引用操作符 ?.,但请注意,这将返回空的空引用,所以它只是"延迟"null的正确处理。

原作者:
0 0

仅针对这种情况- 在字符串比较之前避免检查空值:

if ( foo.equals("bar") ) {
//...
}

将导致 NullPointerException 如果 foo 并不存在。

如果你比较你的String,你可以避免这样做:

if ("bar".equals(foo) ) {
//...
}
原作者:
0 0

根据你正在检查的对象类型,可以使用 apache commons中的一些类,比如: apache commons langapache commons集合

例如:

String foo;
...
if( StringUtils.isBlank( foo ) ) {
///do something
}

或者( 取决于你需要检查的内容):

String foo;
...
if( StringUtils.isEmpty( foo ) ) {
///do something
}

StringUtils类只是其中之一;在commons中有相当多的优秀类可以进行空的安全操作。

这里是一个例子如何使用nullvallidation包括apache library(commons-lang-2.4.jar ) 时在java中

public DOCUMENT read(String xml, ValidationEventHandler validationEventHandler) {
 **Validate.notNull(validationEventHandler,"ValidationHandler not Injected");**
 return read(new StringReader(xml), true, validationEventHandler);
}

如果你使用 spring,spring 在它的软件包中也有同样的功能,参见 library(spring-2.4.6.jar )

如何使用这个例子静态 classf spring(org.springframework.util.Assert )

Assert.notNull(validationEventHandler,"ValidationHandler not Injected");
原作者:
0 0

谷歌收集框架提供了一个好的和优雅的方式来实现空检查。

库类中有如下方法:

static <T> T checkNotNull(T e){
 if(e == null){
 throw new NullPointerException();
 }
 return e;
}

使用的是( 使用 import static ):

...
void foo(int a, Person p){
 if(checkNotNull(p).getAge()> a){
. . .
 }else{
. . .
 }
}
...

或者在你的示例中:

checkNotNull(someobject).doCalc();
原作者:
...