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

时间:2016-12-21 15:34:43

标签: java exception null

我有一个很小但非常讨厌的bug。

实际上我正在编写一个家谱,有些情况下我会搜索一个人,但有时候这个人不在树中(有意义)。所以我的方法返回null。

问题在于我尝试做这样的事情。

familytree.getNode("Peter").getName();

彼得不在树上,但他试图获取名称,我的代码给了我一个NullPointerException(再次有意义)。

虽然我不知道如何处理这类问题,但我有很多类似的方法,比如 getName() ...... 例如 getGender() getWife()等。

我有两个类familytree(使用搜索,删除等方法)和节点(包含有关该人的所有信息)。

也许你们有个主意!

编辑:

例如,这是我的主要方法;

familytree.getNode( “佛瑞德”)getGender(); //布尔

familytree.getNode( “最大”)getGender();

familytree.getNode( “彼得”)getGender();

familytree.getNode( “FE”)getPartner(); //合作伙伴名称

familytree.getNode( “Freddyy”)的getName(); //字符串

如果它是一个nullpointer,我如何检查每个案例?

4 个答案:

答案 0 :(得分:3)

如果你使用的是java 8,而不是检查null,请尝试使用 可选

也许这个主题可以帮助您:Uses for Optional

首先使用Optional可能看起来更像代码,但最终它更清洁,更有效。

答案 1 :(得分:2)

简单的想法:不要那样做!

如果您的方法可以返回 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

答案 2 :(得分:0)

您应该执行类似

的操作
Node node = familytree.getNode("Peter");
if ( null == node ){

    return "non existant";
}

String name = node.getName();

答案 3 :(得分:0)

编辑:实际上,当找不到节点时,你可以在FamilyTree#getNode上返回一个默认的Node而不是null,这应该是正确的方法。

或者您可以使用Java8 Optional并在每次调用时决定如果getNode为null,该怎么做:

关键是使用Optional.ofNullable修改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
}