Java 为什么有些Map实现会在get上抛出异常而另一些则不会
Map的Java Api在get的描述中说:Java 为什么有些Map实现会在get上抛出异常而另一些则不会,java,dictionary,generics,exception,Java,Dictionary,Generics,Exception,Map的Java Api在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
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)抛出它们
这有什么好处?
如果我不知道我使用的是哪种Map实现,那么如何处理呢?来自
某些集合实现对以下元素有限制:
它们可能包含。例如,某些实现禁止null
元素,有些元素对其元素的类型有限制。
尝试添加不符合条件的元素会引发未检查的异常,
通常为NullPointerException或ClassCastException。试图
查询是否存在不符合条件的元素可能引发异常,或者
它可能只是返回false;一些实现将展示
前者的行为,有些会表现出后者。更一般地说,
试图对不合格的元素执行操作,该元素的完成
不会导致将不合格的元素插入到
集合可能引发异常,也可能成功,由
实施。此类例外情况在中标记为“可选”
此接口的规范
技术上的答案是,一些map实现需要密钥属于特定类且不为null。最基本的例子是EnumMap,它需要作为enum对象的键。这是因为枚举对象的序号用于在简单的备份数组中查找值。HashMap不需要键作为特定类的对象来运行。它使用对象类中定义的标准hashCode()方法,所有其他类都从该方法继承 从设计角度来看,答案有两个: 1) 它提供了更多的选择自由,并使不同的实现稍微容易一些
2) 它允许他们在将来改变主意,并执行抛出异常的版本和其他不抛出异常的版本。如果一般的编程风格多年来发生了变化,他们可以为不同品味的人提供一个替代解决方案。我们无法轻易确定为什么某些决定是在20年前做出的。我想可能有一个很好的解释,我没有考虑。如果你不知道实现,然后必须验证
get()
方法的参数。1.)检查它的类型是否正确2.)检查它是否为空,我读这个。我仍然不明白这有什么好处,尤其是在处理我不知道确切实现的映射实例时。@T\u 01我认为这没有任何好处。这可能只是旧时代遗留下来的一些无法改变的包袱,因为Java是完全向后兼容的。这个异常意味着你,程序员,犯了一个错误,你应该修复它,而不是抓住它。ClassCastException通常也是如此。