2

我正在实现 Map 的 java 中的自定义类。根据地图 api,我需要为 put(k,v) 和 putAll(map) 方法抛出 IllegalArgumentException。

如果我有类似的东西,我相信我会抛出这个异常:

MyMapClass<Integer, Integer> map = new MyMapClass<Integer, Integer>;

然后我打电话

map.put ("hello",5).

我是否正确,这是应该导致异常的情况?

如果是这样,我可以就如何测试这个问题获得一些指导吗?我不确定如何找出 put 方法中的对象 k 和 v 的类型。

4

2 回答 2

3

如果尝试在编译器期望整数的地方使用字符串,那将是编译时错误。一般情况下,您不需要抛出 IllegalArgumentException,如果您有一些未强制执行的特殊规则,这只是接口允许您的地图执行的一个选项。

如果您对内容没有特殊限制,则没有理由抛出异常。你会注意到java.util.HashMap实际上并没有抛出它!

例如,如果您有一个只接受正整数作为键的类:

public class MyMapKeyedOnPositiveInts<V> implements Map<Integer, V> {

    public V put (Integer key, V value) {
        if (key < 0) throw new IllegalArgumentException();
        //do put
    }
}
于 2012-12-05T01:08:06.810 回答
2

根据 Java API for Map interface Java 5 (to current) 你通过一个 IllegalArgumentException;

如果此键或值的某些方面阻止它存储在此映射中

您提供的示例不是 Map API 需要的,这是因为泛型。在 Java 5+ 中,Java 将确保它是您在上面指定的编译时错误,因此您可以放心,您不需要在putandputAll方法中检查正确的类型。

那么,MapJavaDoc 中的上述声明对您意味着什么?好吧,这实际上取决于您在实现Map接口时所做的工作。Java 中的许多实现Map都不会抛出异常(HashMap, TreeMap,ConcurrentHashMap等)。

于 2012-12-05T01:13:43.790 回答