7

我有一个如下所示的 Java 命令:

Foo f = new Foo();
String string = f.format(new Bar().getSelection());
                       // ^ may be null

有时我的Bar对象可能返回 null,这是设计使然。

对我来说,很自然的做法是将命令拆分为多行并分别进行空值检查,例如:

Foo f = new Foo();
BarSel bs = new Bar().getSelection();
String string = "";
if (bs != null) {
    string = f.format(bs);
    // continue...
}

但是,我想知道是否有办法在一行中做到这一点?是否可以对内联对象进行空检查?

我似乎记得读过关于能够使用问号的文章,但我不记得确切的语法,我可能错了。请注意,我指的不是三元运算符,尽管这是另一种有效的方法。

4

7 回答 7

13

使用三元运算符

String string = bs != null ? f.format(bs) : "";
于 2012-09-10T07:47:31.950 回答
8

我想你记得被拒绝的猫王运营商( http://mail.openjdk.java.net/pipermail/coin-dev/2009-March/000047.html )( https://blogs.oracle.com/darcy/ entry/project_coin_final_five)来自项目硬币。

但是,jakarta commons 具有类似 nvl 的功能,例如http://commons.apache.org/lang/api-2.6/org/apache/commons/lang/StringUtils.html#defaultString(java.lang.String ) 即使这些函数不是标准的java,它们最终在大多数程序中作为某些库的依赖。

当您设计具有有效空结果的函数时,您遇到的问题很常见:​​您必须在任何地方记录和处理特殊情况。我几乎可以向您保证,有人会在维护过程中搞砸这一切,从而导致虚假的空指针异常。这就是为什么我通常会推荐不返回 null 的设计。

于 2012-09-10T07:55:26.697 回答
6

我迟到了,但我想要类似的东西,并发现使用 Java 8 Optional类。有问题的问题陈述的解决方案:

String string = Optional.ofNullable(bs).map(f::format).orElse("");
于 2017-06-28T14:02:28.900 回答
2

三元运算符的另一种方法:

String string = bs == null ? "" : f.format(bs);
于 2017-11-22T19:18:14.793 回答
1

不在 java 中,但一些基于 JVM 的语言(值得注意:groovy)具有 null 安全取消引用:

http://groovy.codehaus.org/Null+Object+Pattern

于 2012-09-10T07:49:31.727 回答
0

您可以使用三元运算符。

string = bs != null ? f.format(bs) : "";

如果 bs 不为空,这将为您提供一个空字符串文字。或者你可以只使用:

if (bs != null) string = f.format(bs);

于 2012-09-10T07:48:37.297 回答
0
Foo f = new Foo();
BarSel bs = new Bar().getSelection();
String string = bs != null ? f.format(bs) : "";
于 2012-09-10T07:48:44.240 回答