繁体   English   中英

在Java中检查引用是否为null的最佳方法

[英]Best way to check if a reference is null in Java

我想知道什么是最好的方法来检查我们是否在Java中有一个有效的引用。 我知道此语法有效,但令人难以置信。

if (myObj == null) {
  // Do something knowing we have an object
}

我来自其他一些语言,这些语言使您可以像检查c ++一样检查指针。

char* prt = null;
if (ptr) {
  // We know we have a valid c-string 
}

Java中是否有任何模棱两可或类似的语法? 使用编译器扩展或预处理程序我可以。

继续跟进。 在开始讨论之前,我开始谈论为什么我应该只使用Java语法,因为您可能会忘记=符号,请不要这么做。

if (myObj = null) 

将被编译器/ lint捕获。

nullptr_t Java没有将nullptr_t的类似物或指针类型的隐式转换为bool ,因此您必须使用有点冗长的表示法

if (myObj == null)

而在C ++中,我们可以编写

if (myObj)

在这方面,Java不太简洁,而且可以说更清晰。

没有捷径语法可用于处理Java中的null检查,甚至没有其他语言中可用的空合并或空传播运算符。 也没有用户定义的转换运算符,因此您将无法使用C ++惯用语,该惯用语使您无法在返回对象的表达式上编写循环,例如while (cin >> x) { ... }

但是,Java 8中存在一个强大的替代方法,可以完全避免null检查:将可空对象包装在Optional<T> ,并使用其方法隐藏空检查。

这是一个简短的示例:

String s = "Hello";
Optional<String> os = Optional.ofNullable(s);
os.ifPresent(x -> { System.out.println(x); });

上面打印 "Hello" 如果将s设置为null ,则代码将不打印任何内容。

Oracle有关使用Optional<T>的文章。

if(x == null) {
    doSomething();
}

...是Java中的通用习语。 Java的设计者决定不允许将非布尔型变量视为隐式“真实”值。

另一个常见的习惯用法是在三元语句中使用x == null

return x == null ? "not found" : x;

或使用标准方法在null早期引发异常:

Objects.requireNonNull(x);

更一般而言,尝试采用一种编程样式,在这种编程样式中您永远不会期望传递null,因此不必为这种可能性编写代码。

在非公共API上,由于您永远不会传递null,因此您无需测试null(如果发生NullPointerException ,则传递null的人都可以自己负责混乱)。

在公共API中,在传递非null时验证调用者是否有礼貌,但这在每种情况下都不是必不可少的。

一个合理的目标是始终期望输入为非null,并且永远不要返回null(因为Java 8,如有必要,请使用Optional ,或者采用Null Object Pattern )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM