我有这段代码:
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 + "]";
}
}
答案 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...
}
这可能是由两个因素造成的:
this.content
为空es
为空只需记录或调试它,看看哪个是真的
答案 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);