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

时间:2017-11-07 15:59:40

标签: 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) 

将被编译器/ linter捕获。

3 个答案:

答案 0 :(得分:5)

Alas Java没有将nullptr_t的模拟或指针类型隐式转换为bool,因此您必须使用更冗长的符号

if (myObj == null)

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

if (myObj)

在这方面,Java不那么简洁,可以说更清晰。

答案 1 :(得分:4)

在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); });

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

Oracle's article on using Optional<T>.

答案 2 :(得分:1)

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

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

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

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

或者使用标准方法在nulls早期抛出异常:

Objects.requireNonNull(x);

更一般地说,尝试采用一种编程风格,在这种风格中你永远不会期望传递null,因此不需要为这种可能性编写代码。

在非公共API上,因为你永远不会传递null,所以你永远不需要测试null(如果发生了NullPointerException,那么传递null的人可以自己负责这个混乱)。

在公共API中,调用者在传递非空值时可能是礼貌的,但在每种情况下都不是必需的。

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