如何编写NullPointerException安全方法和表达式?

sup*_*ova 4 java exception nullpointerexception

NullPointerException总是一个代码混乱.需要检查每个对象是否为空安全且不抛出NPE.

我遇到了一个情况:

 public void aMethod(Employee emp){
     String fullEmployeeDetailRow = "Name: "+emp.getName().getFirstName()
     +"LastName :"+emp.getName().getFirstName()
    +"Address:"
  +emp.getAddress().getBillingAddress().getBuildingNumber().getApartmentNumber()
  +" "    
  +emp.getAddress().getBillingAddress().getStreetName()
  }
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,NPE有很多可能性.例如在

emp.getAddress().getBillingAddress().getBuildingNumber().getApartmentNumber() 
Run Code Online (Sandbox Code Playgroud)

表达,打电话给

getAddress() or getBillingAddress() or getBuildingNumber() 
Run Code Online (Sandbox Code Playgroud)

任何可以是null和可能的NPE源.所以我现在需要弄乱我的代码来检查每个代码是否为null.

我的问题/想法是:在Java中有没有办法创建一个方法,它接受一个表达式并评估它是否抛出NullPointerException,如果是,则返回一个默认值,比如空白" "

所以在这种情况下我需要一种方法

expression=emp.getAddress().getBillingAddress().getBuildingNumber().getApartmentNumber()

String checkForNPE(expression){
    try{
      return expression;
      }catch(NullPointerException e){
         return " "   // default Value
      }
    }
Run Code Online (Sandbox Code Playgroud)

问题是当我尝试创建这样的方法并将表达式传递给它时,Java会在调用方法之前评估表达式,并事先抛出NPE!

如何将表达式传递给方法并让Java仅在方法内进行评估?

Pet*_*rey 6

在这种情况下,您可以使用Optional.

Option.ofNullable(emp)
      .map(e -> e.getAddress())
      .map(a -> a.getBillingAddress())
      .map(a -> a.getBuildingNumber())
      .map(n -> n.getApartmentNumber())
      .orElse("not set")
Run Code Online (Sandbox Code Playgroud)