在java中实现自己的MapAPI时,如何抛出IllegalArgumentException?

在java中实现自己的MapAPI时,如何抛出IllegalArgumentException?,java,api,class,map,Java,Api,Class,Map,我正在用java实现一个实现Map的自定义类。根据MAPAPI,我需要为put(k,v)和putAll(map)方法抛出一个IllegalArgumentException 如果我有以下情况,我相信我会抛出此异常: MyMapClass<Integer, Integer> map = new MyMapClass<Integer, Integer>; 我认为这是导致异常的情况,对吗 如果是的话,我能得到一些关于如何测试的指导吗?我不确定如何找出put方法中的对象k和v的

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

如果我有以下情况,我相信我会抛出此异常:

MyMapClass<Integer, Integer> map = new MyMapClass<Integer, Integer>;
我认为这是导致异常的情况,对吗


如果是的话,我能得到一些关于如何测试的指导吗?我不确定如何找出put方法中的对象k和v的类型。

如果试图使用编译器需要整数的字符串,这将是一个编译时错误。在一般情况下,不需要抛出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
    }
}
公共类MyMapKeyedOnPositivents实现映射{
公共V put(整数键,V值){
如果(键<0)抛出新的IllegalArgumentException();
//放
}
}

根据接口Java 5的Java API(到当前),您可以通过IllegalArgumentException

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

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


那么
Map
JavaDoc中的上述语句对您意味着什么呢?这实际上取决于您在实现
Map
接口时所做的工作。Java中许多
Map
的实现都没有抛出异常(
HashMap
TreeMap
ConcurrentHashMap
,等等)。

我的Java已经生锈了,所以我可能离基础太远了。。。但若映射是整数到整数的映射,你们的例子会编译吗?不,它不会编译。OP将上述示例引发的编译时异常与MapAPI提到的运行时异常混淆。正如@Affe所指出的,只有当新映射实现有一个特殊的需求没有满足时(例如,如果新映射需要一个正键,并且指定了一个负键),才应该抛出API提到的运行时异常。
public class MyMapKeyedOnPositiveInts<V> implements Map<Integer, V> {

    public V put (Integer key, V value) {
        if (key < 0) throw new IllegalArgumentException();
        //do put
    }
}