在转换为String之前检查对象是否为null

时间:2017-02-24 18:41:59

标签: java

我的代码是null pointer exception

这是我的代码:

StringBuilder strName = new StringBuilder(100); 
strName.append(someClassObject.getFirstName().getContent().get(0));
strName.append(" ");
strName.append(someClassObject.getLastName().getContent().get(0));
name = strName.toString();

尝试在someClassObject.getLastName().getContent().get(0)检索姓氏时抛出空指针异常。

我的问题是,如何继续捕捉空指针的最佳做法。

我在想什么类似的东西:

String lastName = (String) someClassObject.getLastName().getContent().get(0);
if(lastName == null) {
    lastName = "";
    LOGGER.warn("Last name is null");
}
strName.append(lastName);

我犹豫不决,因为我必须将lastName对象转换为String,然后创建逻辑以检查它是否为null。

或者

try { 
    strName.append(someClassObject.getLastName().getContent().get(0));
} catch(NullPointerException e) {
    LOGGER.warn("Last name of the conusmer is null");
}

3 个答案:

答案 0 :(得分:0)

仅当您使用已经为空的对象调用方法时才会发生异常(您可以调试以查看哪个对象是根null)。

如果您的null为someClassObject.getLastName() 您可以使用此oneliner检查java中的nullity:

String lastName = (someClassObject.getLastName() == null) ? "" : someClassObject.getLastName().getContent().get(0);

答案 1 :(得分:0)

StringBuilder.append()的所有重载都是空的。如果输入为null,它们会附加文本null。因此,您必须从表达式someClassObject.getLastName().getContent().get(0)中的任何一种方法获取NPE。

如果这些方法不是null安全的,那么最好在链接下一个方法之前检查null,而不是捕获NPE。这样您可能需要编写一些样板代码,但执行时间会更便宜。例外情况成本很高,即使这些例外情况得到处理。

另一个选项是,如果可能的话,更改方法getLastName()getContent()get(),使它们为null安全 - 返回空值而不是抛出NPE。在这种情况下,您必须考虑如果进行此更改,这些方法的其他用户将如何反应。

答案 2 :(得分:0)

您可以使用Java 8 Optional 检查对象在每个级别是否为空 someClassObject ,如下:

StringBuilder strName = new StringBuilder(100); 
Optional<List<String>> option = Optional.of(someClassObject)
                    .map(SomeClassObject::getLastName).map(LastName::getContent);

   if (option.isPresent()) {
        strName.append(option.get().get(0));
   }

我建议使用ifPresent选项,而不需要if语句。

类似的东西:

option.ifPresent(e -> strName.append(option.get().get(0)))