我想知道检查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捕获。
答案 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
,则代码不会打印任何内容。
答案 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)。