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

打印 上一主题 下一主题

主题 1953|帖子 1953|积分 5859

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
经常会用到map中的 keySet() 方法,得到的是 java.util.concurrent.ConcurrentHashMap$KeySetView 对象。
然后使用 contains 方法发现会抛出 NullPointerException
但是通过打印日志发现 set 是有数据的。
查看源码发现
  1. public static class KeySetView<K,V> extends CollectionView<K,V,K>
  2.     implements Set<K>, java.io.Serializable {
  3.     private static final long serialVersionUID = 7249069246763182397L;
  4.     private final V value;
  5.     KeySetView(ConcurrentHashMap<K,V> map, V value) {  // non-public
  6.         super(map);
  7.         this.value = value;
  8.     }
  9.     /**
  10.      * {@inheritDoc}
  11.      * @throws NullPointerException if the specified key is null
  12.      */
  13.     public boolean contains(Object o) { return map.containsKey(o); }
  14. }
复制代码
原来当传入的key会为空的时候,会抛出 NullPointerException
办理方案
防御性编程发起
  1. String target = ...;
  2. if (target != null && set.contains(target)) {
  3.     // 业务逻辑
  4. }
复制代码
前期制止了 null 通报到 set.contains(param)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

科技颠覆者

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表