我的代码是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");
}
答案 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)))