我有一个很小但非常讨厌的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,我如何检查每个案例?
答案 0 :(得分:3)
答案 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
}