通常,我可以看到如下代码构造:
if(a == null || b == null || c == null){
//...
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有任何广泛使用的库(谷歌,阿帕奇等)同时检查多个对象的无效,例如:
if(anyIsNull(a, b, c)){
//...
}
Run Code Online (Sandbox Code Playgroud)
要么
if(allAreNulls(a, b, c)){
//...
}
Run Code Online (Sandbox Code Playgroud)
更新:
让它更具挑战性,并用以下内容替换原始示例:
if(a != null && a.getFoo() != null && a.getFoo().getBar() != null){
//...
}
Run Code Online (Sandbox Code Playgroud)更新2:
我已经为Apache Commons Lang库创建了一个pull请求来修复这个差距:
这些将被纳入commons-lang,版本3.5:
anyNotNull (Object... values)allNotNull (Object... values)假设我想执行以下命令:
house.getFloor(0).getWall(WEST).getDoor().getDoorknob();
Run Code Online (Sandbox Code Playgroud)
为了避免NullPointerException,我必须在以下情况下执行以下操作:
if (house != null && house.getFloor(0) && house.getFloor(0).getWall(WEST) != null
&& house.getFloor(0).getWall(WEST).getDoor() != null) ...
Run Code Online (Sandbox Code Playgroud)
是否有一种方法或已经存在的Utils类更优雅地执行此操作,让我们说类似下面的内容?
checkForNull(house.getFloor(0).getWall(WEST).getDoor().getDoorknob());
Run Code Online (Sandbox Code Playgroud) 有时我面对我必须写一段这样的代码(通常它有更多的嵌套if和更复杂的结构,但是对于这个例子来说)
public void printIt(Object1 a){
if (a!=null){
SubObject b= a.getB();
if (b!=null){
SubObject2 c=b.getC();
if(c!=null){
c.print();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我不需要知道什么是失败的,如果什么是空的什么都不做,一种方法可能是
public void printIt(Object1 a){
try{
a.getB().getC().print();
}catch (NullPointerException e) {
}
}
Run Code Online (Sandbox Code Playgroud)
第二种形式如性能或其他类型的问题是否有问题?
谢谢
我的代码如下:
obj1 = SomeObject.method1();
if (obj1 != null) {
obj2 = obj1.method2();
if (obj2 != null) {
obj3 = obj2.method3();
if (obj3 != null) {
............
return objN.methodM();
}
}
}
....
Run Code Online (Sandbox Code Playgroud)
我有近10步.它似乎非常脆弱且容易出错.有没有更好的方法来检查空链方法?
谢谢.
例如,在代码中,我们有很多链式方法obj.getA().getB().getC().getD().我想创建一个帮助类,它将检查方法getD()是否为null,但在此之前我需要检查所有以前的getter.我可以这样做:
try {
obj.getA().getB().getC().getD();
}
catch (NullPointerException e) {
// some getter is null
}
Run Code Online (Sandbox Code Playgroud)
或者(这是"愚蠢的")
if (obj!null && obj.getA()!=null && obj.getA().getB()!=null && ...) {
obj.getA().getB().getC().getD();
}
else {
// some getter is null
}
Run Code Online (Sandbox Code Playgroud)
我不想每次都try{} catch()在我的代码中使用它来检查它.为此目的,最佳解决方案是什么?
我认为最好的将是:
obj.getA().getB().getC().getD().isNull()- 为此我需要更改所有的getter,例如实现一些包含isNull()方法的接口.NullObjectHelper.isNull(obj.getA().getB().getC().getD()); - 这将是最好的(我想是这样),但如何实现这一点?我的问题如下,我有一个很长的Getter,即,
objectA.getObjectB().getObjectC().getObjectD().getObjectE().getName();
Run Code Online (Sandbox Code Playgroud)
由于"糟糕"的数据库/实体设计(某些事情比其他人更晚引入),它会发生getObjectB(),getObjectC()或者getObjectD()可能会返回NULL.
通常我们一直使用空值检查,但在这种情况下,我必须使用
ObjectB b = objectA.getObjectB();
if (b != null) {
ObjectC c = b.getObjectC();
if (c != null) {
ObjectD d = c.getObjectD();
if (d != null)
return d.getObjectE().getName();
}
}
return "";
Run Code Online (Sandbox Code Playgroud)
相反,简单地使用try-catch块会容易得多
try {
return objectA.getObjectB().getObjectC().getObjectD().getObjectE().getName();
} catch (NullPointerException e) {
return "";
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我真的不关心哪个对象返回NULL,它要么显示名称,要么不显示.是否有任何并发症或使用try-catch而不是检查是不好的设计?
感谢您的输入.
捕获异常而不是进行检查时,try-catch需要多长时间(以纳秒为单位)(假设消息具有HashMap类型的查找性能)?
try {
timestamp = message.getLongField( MessageField.TIMESTAMP );
} catch (MissingDataException e) {
//Not all messages contain this field
}
Run Code Online (Sandbox Code Playgroud)
VS
if (message.contains(MessageField.TIMESTAMP))
timestamp = message.getLongField( MessageField.TIMESTAMP );
Run Code Online (Sandbox Code Playgroud)