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)呢?
那有什么好处? 以及如何解决这个问题,如果我不知道我正在使用哪个地图实施?
答案 0 :(得分:0)
来自RFC 6750
某些集合实现对元素有限制 他们可能包含。例如,某些实现禁止null 元素,有些元素的元素类型有限制。 尝试添加不合格的元素会引发未经检查的异常, 通常是NullPointerException或ClassCastException。试图 查询不合格元素的存在可能会抛出异常,或者 它可能只是返回虚假;一些实现将展示 以前的行为和一些将展示后者。更普遍, 尝试对完成的不合格元素进行操作 不会导致不合格的元素插入 集合可以抛出异常,也可以成功,可以选择 实施。此类例外标记为"可选"在里面 此接口的规范。
答案 1 :(得分:0)
技术答案是一些地图实现需要键是特定类而不是null。最基本的例子是EnumMap,它需要作为枚举对象的键。这是因为enum对象的序号用于在简单的后备数组中查找值。 HashMap不需要键作为特定类的对象来运行。它使用Object类中定义的标准hashCode()方法,所有其他类都继承自该方法。
从设计角度来看,答案是双重的:
1)它提供了更多的选择自由,并使不同的实现更容易。
2)它允许他们在将来改变主意,做出抛出异常的版本和其他没有的版本。如果一般编程风格多年来发生变化,他们可以为不同品味的人提供替代解决方案。