【发布时间】:2011-09-04 10:36:25
【问题描述】:
所以我知道我可能有一个空列表(特别是 ArrayList)。现在,当我已经在检查它时,像这样的简单检查实际上会引发 NullPointerException。这个让我很困惑,因为我一直成功使用它,但我确定我错过了一些东西:
public class MyPost {
private int id;
private List<Label> labels;
public MyPost(int id){ this.id = id }
//getter setters for both plus this added method:
public void addLabel(Label aLabel)
{
if(labels == null)
labels = new ArrayList<Label>();
labels.add(aLabel);
}
}
现在在我的代码的另一部分中,我正在遍历客户端发送的 ID 列表。为简单起见,假设循环变量“i”正在提供 ids
MyPost aPost = new MyPost(i);
按照我的逻辑,我可能会也可能不会在帖子中添加标签。所以最后在继续之前,我会检查是否存在这样的标签:
if(aPost.getLabels()!=null)
//process labels
现在,如果标签列表中没有添加任何内容,则会引发空指针异常!但这正是我想要检查的内容,并且仍在获得 NPE !!!
如果没有添加任何内容,我知道 aPost.getLabels() 为 null。但是比较似乎失败并抛出了 NPE。如何解决这个问题?简直把我难住了!
更新: 这是获取标签代码。只是一个微不足道的吸气剂......
public List<Label> getLabels() { return labels;}
我们注意到了一些我们之前忽略的东西。我确定java习惯于“短路”它的if条件,即在OR条件下,如果第一个条件评估为true,它不会检查第二个(如果第一个条件评估为false,AND类似的短路)。我不完全确定这是否是原因,但这是 if 子句:
if(aPost.getLabels()!=null || !aPost.getLabels().isEmpty())
//process labels
如果列表确实为空,则不应评估第二个条件,对吗?似乎这可能是原因,但我们仍在测试它。现在只是预感......
【问题讨论】:
-
向我们展示
getLabels()代码。 -
如果可以的话,发布你的 getLabels() 方法和你的 NPE
-
如果这个简单的比较抛出 NPE,也许你最好检查一下 aPost 是否为空。我认为,在比较之前抛出的 NPE。
-
@Nupul:您阅读给出的正确答案了吗?他们告诉你 aPost 是空的。我知道你说不是,但你做过检查吗?一个简单的
System.out.println("aPost is null: " + (aPost == null));将在抛出 NPE 的行之前完成。 -
@Hovercraft:在下面回复您的评论。是的,我已经添加了支票。它总是打印为非空:)