科技颠覆者 发表于 5 天前

使用set的contains方法抛出空指针非常小记

经常会用到map中的 keySet() 方法,得到的是 java.util.concurrent.ConcurrentHashMap$KeySetView 对象。
然后使用 contains 方法发现会抛出 NullPointerException
但是通过打印日志发现 set 是有数据的。
查看源码发现
public static class KeySetView<K,V> extends CollectionView<K,V,K>
    implements Set<K>, java.io.Serializable {
    private static final long serialVersionUID = 7249069246763182397L;
    private final V value;
    KeySetView(ConcurrentHashMap<K,V> map, V value) {// non-public
      super(map);
      this.value = value;
    }

    /**
   * {@inheritDoc}
   * @throws NullPointerException if the specified key is null
   */
    public boolean contains(Object o) { return map.containsKey(o); }
}
原来当传入的key会为空的时候,会抛出 NullPointerException
办理方案
防御性编程发起
String target = ...;
if (target != null && set.contains(target)) {
    // 业务逻辑
}
前期制止了 null 通报到 set.contains(param)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 使用set的contains方法抛出空指针非常小记