NullPointerException
虽然这篇文章已经快 5 年了,但对于如何处理s 的古老问题,我可能有另一种解决方案。
简而言之:
end: {
List<People> people = family.getPeople(); if(people == null || people.isEmpty()) break end;
People person = people.get(0); if(person == null) break end;
Address address = person.getAddress(); if(address == null) break end;
PostalCode postalCode = address.getPostalCode(); if(postalCode == null) break end;
System.out.println("Do stuff");
}
由于仍有大量遗留代码仍在使用中,因此使用 Java 8Optional
并不总是一种选择。
每当涉及深度嵌套的类(JAXB、SOAP、JSON 等等)并且没有应用Demeter 法则时,您基本上必须检查所有内容,看看是否有可能的 NPE 潜伏在周围。
我提出的解决方案力求提高可读性,如果不涉及至少 3 个或更多嵌套类,则不应使用(当我说嵌套时,我并不是指正式上下文中的嵌套类)。由于代码的阅读量多于编写量,因此快速浏览一下代码的左侧部分将比使用深度嵌套的 if-else 语句更清楚地说明其含义。
如果你需要 else 部分,你可以使用这个模式:
boolean prematureEnd = true;
end: {
List<People> people = family.getPeople(); if(people == null || people.isEmpty()) break end;
People person = people.get(0); if(person == null) break end;
Address address = person.getAddress(); if(address == null) break end;
PostalCode postalCode = address.getPostalCode(); if(postalCode == null) break end;
System.out.println("Do stuff");
prematureEnd = false;
}
if(prematureEnd) {
System.out.println("The else part");
}
某些 IDE 会破坏这种格式,除非您指示它们不要这样做(请参阅此问题)。
你的条件必须被反转——你告诉代码什么时候应该中断,而不是什么时候应该继续。
还有一件事 - 您的代码仍然容易损坏。您必须将if(family.getPeople() != null && !family.getPeople().isEmpty())
其用作代码中的第一行,否则空列表将引发 NPE。