Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么有些Map实现会在get上抛出异常而另一些则不会_Java_Dictionary_Generics_Exception - Fatal编程技术网

Java 为什么有些Map实现会在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

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)不抛出它们,而其他实现(例如ConcurrentSkipList)抛出它们

这有什么好处? 如果我不知道我使用的是哪种Map实现,那么如何处理呢?

来自

某些集合实现对以下元素有限制: 它们可能包含。例如,某些实现禁止null 元素,有些元素对其元素的类型有限制。 尝试添加不符合条件的元素会引发未检查的异常, 通常为NullPointerException或ClassCastException。试图 查询是否存在不符合条件的元素可能引发异常,或者 它可能只是返回false;一些实现将展示 前者的行为,有些会表现出后者。更一般地说, 试图对不合格的元素执行操作,该元素的完成 不会导致将不合格的元素插入到 集合可能引发异常,也可能成功,由 实施。此类例外情况在中标记为“可选” 此接口的规范


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

从设计角度来看,答案有两个:

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


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

我们无法轻易确定为什么某些决定是在20年前做出的。我想可能有一个很好的解释,我没有考虑。如果你不知道实现,然后必须验证
get()
方法的参数。1.)检查它的类型是否正确2.)检查它是否为空,我读这个。我仍然不明白这有什么好处,尤其是在处理我不知道确切实现的映射实例时。@T\u 01我认为这没有任何好处。这可能只是旧时代遗留下来的一些无法改变的包袱,因为Java是完全向后兼容的。这个异常意味着你,程序员,犯了一个错误,你应该修复它,而不是抓住它。ClassCastException通常也是如此。