Java 在第一个循环中避免NullPointerException
我有一段代码:Java 在第一个循环中避免NullPointerException,java,nullpointerexception,Java,Nullpointerexception,我有一段代码: EventSnapshot snapshotEvent = new EventSnapshot(); EventSnapshot currentEvent = new EventSnapshot(); do { ... currentEvent.setContent(in_stats); ... if(!snapshotEvent.equals(currentEvent)) snapshotEven
EventSnapshot snapshotEvent = new EventSnapshot();
EventSnapshot currentEvent = new EventSnapshot();
do
{
...
currentEvent.setContent(in_stats);
...
if(!snapshotEvent.equals(currentEvent))
snapshotEvent.setContent(in_stats);
}
while(true);
在第一个循环中,我得到了一个NullPointerException
,因为对象快照事件显然是空的。在第二个循环中,这不会发生。如何避免此问题
编辑
这就是错误,发生在这里:
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 + "]";
}
}
如果shapshotEvent!=null或catch NullPointerException带有空块。更改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
为空只需记录或调试它,然后从您提供的代码中查看哪个是正确的,很难判断是什么导致了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);
不是
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...
}
您的
EventSnapshot.equals
方法已损坏-如果content
为null,它将引发异常
请确保快照从不包含空内容,或者将更改为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()
有点奇怪,因为snapshotEvent=new EventSnapshot()
不是空的…您给出的代码中没有“明显”的内容snapshotEvent
不为空-您在第一行中将其设置为非空引用。请展示一个简短但完整的程序,该程序演示了该问题。NullPointerException在比源代码中演示的级别更低的级别上引发。代码非常长…我将花时间减少并获取problem@user1508419:回答。这就是为什么提供简短但完整的程序来演示这个问题如此重要的原因——我们不可能从初始问题中的信息来诊断这个问题。捕捉空指针实际上并不能解决它们。它只是将它们隐藏在调用堆栈更上层的视图中。从根本上说,NullPointerException表示程序的控制流存在问题,因此捕获它们很少(如果有)是正确的做法(调整控制流以确保它们不会发生更好)。我理解null是统计内容,但如何避免此问题?绝对不是。NullPointerException
表示一个bug。捕获和忽略异常是一件可怕的事情,在许多情况下可能会破坏数据。通常,您应该只在堆栈的较高级别捕获异常
,例如,为了防止一个bug导致整个服务器停机,但您可以有效地中止该请求或用户操作。继续下去是错误的。@JonSkeet我不同意你的看法。捕获和忽略异常可能是一件可怕的事情。在某些情况下,NullPointerException
可能不好,但“ok”好,当然最好找到原因并解决它。但如果你不使用“快速修复”,我们就不会很快取得任何进展。