为什么有些Map实现会在get和other上抛出异常

时间:2017-11-05 21:44:10

标签: java dictionary generics exception

Java Api for Map在get:

的描述中说
Throws:
ClassCastException - if the key is of an inappropriate type for this map (optional)
NullPointerException - if the specified key is null and this map does not permit null keys (optional)

为什么这个例外是可选的?或者,为什么某些实现(例如HashMap)不抛出它们,但其他实现(例如ConcurrentSkipList)呢?

那有什么好处? 以及如何解决这个问题,如果我不知道我正在使用哪个地图实施?

2 个答案:

答案 0 :(得分:0)

来自RFC 6750

  

某些集合实现对元素有限制   他们可能包含。例如,某些实现禁止null   元素,有些元素的元素类型有限制。   尝试添加不合格的元素会引发未经检查的异常,   通常是NullPointerException或ClassCastException。试图   查询不合格元素的存在可能会抛出异常,或者   它可能只是返回虚假;一些实现将展示   以前的行为和一些将展示后者。更普遍,   尝试对完成的不合格元素进行操作   不会导致不合格的元素插入   集合可以抛出异常,也可以成功,可以选择   实施。此类例外标记为"可选"在里面   此接口的规范。

答案 1 :(得分:0)

技术答案是一些地图实现需要键是特定类而不是null。最基本的例子是EnumMap,它需要作为枚举对象的键。这是因为enum对象的序号用于在简单的后备数组中查找值。 HashMap不需要键作为特定类的对象来运行。它使用Object类中定义的标准hashCode()方法,所有其他类都继承自该方法。

从设计角度来看,答案是双重的:

1)它提供了更多的选择自由,并使不同的实现更容易。

2)它允许他们在将来改变主意,做出抛出异常的版本和其他没有的版本。如果一般编程风格多年来发生变化,他们可以为不同品味的人提供替代解决方案。