Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在第一个循环中避免NullPointerException_Java_Nullpointerexception - Fatal编程技术网

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”好,当然最好找到原因并解决它。但如果你不使用“快速修复”,我们就不会很快取得任何进展。