我有一个很小但非常烦人的错误。
实际上,我正在编程一棵家谱,有些情况我正在寻找一个人,但有时该人不在树上(很有意义)。因此,我的方法返回空。
问题是当我尝试做这样的事情时。
familytree.getNode("Peter").getName();
彼得不在树上,但是他试图获取名称,而我的代码给了我NullPointerException
(再次有意义)。
尽管我不知道如何处理这种问题,但我有很多类似的方法,例如 getName() ...例如 getgender(), getwife()等。
我有两个类别的家庭树(带有搜索,删除等)和节点(有关该人的所有信息)。
也许你们有一个主意!
编辑:
例如,这是我的主要方法;
familytree.getNode(" fred")。getGender();//布尔
familytree.getNode(" max")。getgender();
familytree.getNode(" peter")。getgender();
familytree.getNode(" fe")。getPartner();//合作伙伴名称
familytree.getNode(" freddyy")。getName();//字符串
如果nullpointer,如何检查每种情况?
如果使用Java 8,而不是检查null,请尝试使用可选
也许这个主题可以帮助您:可选的使用
首先使用可选的代码似乎更像是更多的代码,但最终更清洁,更有效。
简单的想法:不要那样做!
如果您的方法 can 返回 null ,那么您必须检查,例如:
Person p = familytree.getNode("Peter");
if (p != null) {
do something with p.getName();
} else {
tell user: Peter is not known!
或检查前期:
if (familytree.contains("Peter")) {
p = familytree.getNode("Peter"); // will be save
您应该做
之类的事情Node node = familytree.getNode("Peter");
if ( null == node ){
return "non existant";
}
String name = node.getName();
编辑:实际上,您可以在找不到节点时返回一个默认节点,而不是familytree#getNode的null,这应该是正确的方法。
在
关键是使用可选的familytree#getNode方法修改。然后使用MAP和ORELSE处理可能的空值,提供默认值或获取实际属性。
请参阅此:
static class FamilyTree {
private Map<String, Node> nodes = new HashMap<>();
// put some values in this map
Optional<Node> getNode(String key) {
return Optional.ofNullable(this.nodes.get(key));
}
}
static class Node {
private boolean gender;
private String partner;
private String name;
boolean getGender() {
return this.gender;
}
String getPartner() {
return this.partner;
}
String getName() {
return this.name;
}
}
@Test
public void test_nado() {
FamilyTree familytree = new FamilyTree();
familytree.getNode("Fred").map(Node::getGender).orElse(false); //boolean
familytree.getNode("Max").map(Node::getGender).orElse(false);
familytree.getNode("Peter").map(Node::getGender).orElse(false);
familytree.getNode("Fe").map(Node::getPartner).orElse(""); //Partner Name
familytree.getNode("Freddyy").map(Node::getName).orElse(""); //String
}