0
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() の後、揮発性マップが null になる可能性がある場合は? 別のマシンで実行すると、1 つのマシン ヒントの null 例外が発生します。しかし、キーワードを削除した後: volatile 、すべて問題ありません。なぜ?

ps: マップを null に設定できるパブリック メソッドはありません。

4

3 に答える 3

2

いいえ、できません —コンストラクターからリークnullしない限り。あなたはそれをしていないようです。this

をトリガーするコードなど、さらに多くのコードを見せていただければNullPointerException、問題についてもっと本質的なことがわかるかもしれません。

finalあなたのフィールドはそうではないので、プログラムのどこからでもフィールドが無効になる可能性がまだ残っていることに注意してください。

于 2013-05-30T09:37:24.853 に答える