在第一个循环中避免NullPointerException

时间:2012-07-08 08:57:47

标签: java nullpointerexception

我有这段代码:

EventSnapshot snapshotEvent = new EventSnapshot();

EventSnapshot currentEvent = new EventSnapshot();

do
{
   ...              
currentEvent.setContent(in_stats); 
   ...              
if(!snapshotEvent.equals(currentEvent))
    snapshotEvent.setContent(in_stats);
}
while(true);

在第一个周期,我得到一个NullPointerException,因为很明显对象snapshotEvent是空的。在第二个周期,这不会发生。现在可以避免这个问题吗?

修改

这是错误,它发生在这里:

java.lang.NullPointerException
    at org.w3c.jigmonitor.EventSnapshot.equals(EventSnapshot.java:40)



public class EventSnapshot 
{
    private Statistics content;

    public EventSnapshot()
    {
        super();
    }

    /**
     * @return the content
     */
    public Statistics getContent() 
    {
        return content;
    }

    /**
     * @param content the content to set
     */
    public void setContent(Statistics content) 
    {
        this.content = content;
    }

    public boolean equals(EventSnapshot es)
    {
        return this.content.equals(es.getContent()); // here...
    }

    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "EventSnapshot [content=" + content + "]";
    }   
}

5 个答案:

答案 0 :(得分:0)

更改if语句:

if(snapshotEvent!= null && !snapshotEvent.equals(currentEvent))
    snapshotEvent.setContent(in_stats);
}

修改

编辑后,错误发生在equals方法中:

public boolean equals(EventSnapshot es)
    {
        return this.content.equals(es.getContent()); // here...
    }

这可能是由两个因素造成的:

  1. this.content为空
  2. es为空
  3. 只需记录或调试它,看看哪个是真的

答案 1 :(得分:0)

snapshotEvent不是null,而是它的内容:snapshotEvent.content。 您可以将equals方法更改为:

public boolean equals(EventSnapshot es)
{
   if(es == null) return false;
   if(content == null) return false;
   if(es.content == null) return false;
   return this.content.equals(es.getContent()); // here...
}

答案 2 :(得分:0)

您的EventSnapshot.equals方法已损坏 - 如果content为空,则会抛出异常。

确保快照永远不会有空内容,更改equals如下所示:

public boolean equals(EventSnapshot es) {
    // TODO: Decide how to handle the situation where es itself is null
    if (content == es.getContent()) {
        return true;
    }
    if (content == null || es.getContent() == null) {
        return false;
    }
    return content.equals(es.getContent());
}

请注意,如果覆盖equals()Object.equals(),则提供新的Object.hashCode()重载有点奇怪。

答案 3 :(得分:-1)

如果shapshotEvent!= null或者使用空块捕获NullPointerException,则需要检查。

答案 4 :(得分:-1)

从您提供的代码中很难说出导致NullpointerException的原因。但是你可以随时抓住它并让你的代码进入下一次迭代;也许这解决了它:

EventSnapshot snapshotEvent = new EventSnapshot();
EventSnapshot currentEvent = new EventSnapshot();
do {
    try {
        ...              
        currentEvent.setContent(in_stats); 
        ...              
        if(!snapshotEvent.equals(currentEvent))
            snapshotEvent.setContent(in_stats);
    } catch (Exception e) {
        e.printStacktrace();
    }
} while(true);