public class SipResponseCollection {

    private final static Logger LOGGER=Logger.getLogger(SipResponseCollection.class);
    private volatile Map<String, List<SipResponse>> map = new HashMap<String, List<SipResponse>>();

    public SipResponseCollection() {
    }

    public boolean contain(String callId, int statusCode) {
        List<SipResponse> list = map.get(callId);  //pop null exception in linux amd64 machine but right for windows machine. callId is not null.
        if(list==null)
            return false;
        for (SipResponse sipResponse : list) {
            if (sipResponse.getStatusCode() == statusCode)
                return true;
        }

        return false;
}
}


在新的SipResponseCollection()之后,如果volatile映射可以为null?我在另一台机器上运行,一台机器提示null异常。但是删除关键字volatile之后,一切都OK。为什么?

ps:没有任何公共方法可以将地图设置为null。

最佳答案

不,它不能是null,除非您设法从构造函数中泄漏this。您似乎没有这样做。

如果您向我们展示了更多代码,例如触发NullPointerException的代码,那么关于您的问题可能有更多实质性的说法。

请注意,您的字段不是final,因此仍然有可能该字段在程序中的任何地方都为空。

10-07 20:29