方法返回null并尝试调用方法



我有一个很小但非常烦人的错误。

实际上,我正在编程一棵家谱,有些情况我正在寻找一个人,但有时该人不在树上(很有意义)。因此,我的方法返回空。

问题是当我尝试做这样的事情时。

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
}

相关内容

  • 没有找到相关文章

最新更新