请考虑以下代码段:
if (foo != null
&& foo.bar != null
&& foo.bar.boo != null
&& foo.bar.boo.far != null)
{
doSomething (foo.bar.boo.far);
}
我的问题很简单:有更简单\更短的方法吗?
详细说明:有没有更简单的方法来验证链的每个部分,我想这与此类似..
if (validate("foo.bar.boo.far"))
{
doSomething (foo.bar.boo.far);
}
答案 0 :(得分:5)
也许那样?
if (FooUtils.isFarNotEmpty(foo)){
doSomething (foo.bar.boo.far);
}
和FooUtils
:
boolean isFarNotEmpty (Foo foo){
return foo != null &&
foo.bar != null &&
foo.bar.boo != null &&
foo.bar.boo.far != null;
}
答案 1 :(得分:2)
在我看来,这个表达是完美的,没有什么可以更简单
答案 2 :(得分:1)
为什么要使用公共实例变量,封装公共变量并为它们创建getter和setter,你可以在getter中执行这些检查,如果其中任何一个为null,你可以返回新的Object(),或者你可以在try-catch块中运行此语句但不推荐,
答案 3 :(得分:1)
如果这是您的API,请consider some advice。
“我称之为十亿美元的错误。” - C. A. R. R. Hoare爵士 空引用的发明
答案 4 :(得分:0)
遗憾的是,你无法做到这一点。如果你问我,这是Java语言的问题。 Groovy有一个名为Safe Navigation Operator ?.的东西,专门用于此目的。这是我过去做过的两件事。
Naively编写了访问它的代码,并将其包含在一个NPE的try / catch中。这是一个例子:
try {
if (foo.bar.boo.far != null) {
//do something
}
} catch (NullPointerException e) {
//do what you would do in an else
}
我不是特别喜欢第二个选项,但我说如果它实际上使代码更清晰,请考虑使用它。
有一次我使用的库是一个非常薄的XML模式包装器,我决定在这种情况下使用第二个选项。如果我没有,代码将更难维护,因为忘记空检查会很容易,并且它们会混淆重要的逻辑。我认为这是使用它的有效案例。
答案 5 :(得分:0)
请尝试此代码
try {
if (foo.bar.boo.far != null) {
//No object is null
}
} catch (Exception e) {
// some object is null and causes null point exception.
}