Java 在转换为字符串之前检查对象是否为null

Java 在转换为字符串之前检查对象是否为null,java,Java,我的代码抛出了一个空指针异常 这是我的密码: StringBuilder strName = new StringBuilder(100); strName.append(someClassObject.getFirstName().getContent().get(0)); strName.append(" "); strName.append(someClassObject.getLastName().getContent().get(0)); name = strName.toStrin

我的代码抛出了一个
空指针异常

这是我的密码:

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对象转换为
字符串
,然后创建逻辑来检查它是否为null


只有在使用已为null的对象调用方法时才会发生异常(您可以调试以查看哪个对象是根null)

如果空值是
someClassObject.getLastName()
您可以使用以下oneliner检查java中的空值:

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

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

如果这些方法不是空安全的,那么最好在链接下一个方法之前检查空值,而不是捕获NPE。这样,您可能需要编写一些样板代码,但执行时间会更便宜。异常是昂贵的,即使它们被处理


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

您可以使用
Java8
检查
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));
   }

您不必将其转换为字符串来检查它是否为空。第二种方法的主要问题是,您无法分辨什么是空的。它可能是
someClassObject
、返回值
getLastName()
、返回值
getContent()
或实际字符串。@JimGarrison如果我不介意哪个返回null呢?只是整个对象是空的。我这么说是因为
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));
   }
option.ifPresent(e -> strName.append(option.get().get(0)))