相关疑难解决方法(0)

如何检查多个对象的无效?

通常,我可以看到如下代码构造:

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)

更新:

  1. 我完全知道如何自己写
  2. 我知道这可能是程序结构不佳的结果,但这不是一个案例
  3. 让它更具挑战性,并用以下内容替换原始示例:

    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)

java null nullable

43
推荐指数
4
解决办法
3万
查看次数

检查"get"调用链是否为null

假设我想执行以下命令:

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)

java null nullpointerexception

36
推荐指数
5
解决办法
1万
查看次数

在java中尝试/ catch vs null检查

有时我面对我必须写一段这样的代码(通常它有更多的嵌套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)

第二种形式如性能或其他类型的问题是否有问题?

谢谢

java

32
推荐指数
4
解决办法
2万
查看次数

如何更好的重构方法链可以在java中返回null?

我的代码如下:

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步.它似乎非常脆弱且容易出错.有没有更好的方法来检查空链方法?

谢谢.

java methods null refactoring chain

8
推荐指数
3
解决办法
3073
查看次数

检查方法链中的最后一个getter是否为null

例如,在代码中,我们有很多链式方法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()在我的代码中使用它来检查它.为此目的,最佳解决方案是什么?

我认为最好的将是:

  1. obj.getA().getB().getC().getD().isNull()- 为此我需要更改所有的getter,例如实现一些包含isNull()方法的接口.
  2. NullObjectHelper.isNull(obj.getA().getB().getC().getD()); - 这将是最好的(我想是这样),但如何实现这一点?

java design-patterns

8
推荐指数
2
解决办法
3754
查看次数

使用多个吸气剂时尝试捕获而不是空检查

我的问题如下,我有一个很长的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而不是检查是不好的设计?

感谢您的输入.

java

8
推荐指数
1
解决办法
335
查看次数

尝试Catch Performance Java

捕获异常而不是进行检查时,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)

java performance try-catch

6
推荐指数
1
解决办法
7392
查看次数