如何使散列table在插入空键(Java)时抛出异常?

How to make a hash table throw an exception when inserting a null key (Java)?

为了进行评估,我需要创建一个散列 table,我已经这样做了。但是,我需要在插入空键时抛出异常。

我需要通过的测试 运行 是:

@Test(expected = IllegalArgumentException.class)
public void testNullKey() {
    Hashtable<Boolean> h = new Hashtable<>(10);
    h.put(null, true);
}

这给了我错误:

java.lang.Exception: Unexpected exception, expected<java.lang.IllegalArgumentException> but was<java.lang.NullPointerException>

Caused by: java.lang.NullPointerException: Cannot invoke "String.hashCode()" because "key" is null
    at Hashtable.hash(Hashtable.java:270)
    at Hashtable.put(Hashtable.java:84)
    at test.TestHT.testNullKey(TestHT.java:52)

Hashtable.hash(Hashtable.java:270) 是:

private int hash(String key)
{
    int hashVal = key.hashCode();
    hashVal %= max;

    if (hashVal < 0)

        hashVal += max;

    return hashVal;
}

和Hashtable.put(Hashtable.java:84)是:

public void put(String key, V value)
{
    int h = 0;

    if (getLoadFactor() > maxLoad)
        resize();

    h = probeType == PROBE_TYPE.LINEAR_PROBE ? hash(key) : doubleHash(key);

    if (get(key) != null)
    {
        arr[h] = new Pair(key, value);
    } else
    {
        arr[findEmpty(h, 0, key)] = new Pair(key, value);
        itemCount++;
    }
}

插入空键时抛出异常,我完全不知所措。我试过在 put 中添加 throw new IllegalArgumentException(); 和其他类似的尝试,但我无法让它工作。

有没有人有任何想法或指示?

好的。所以这个 Hashtable class 是你的代码,而不是 java.util.Hashtable。 (你在那里骗了我一分钟......)

解决方法很简单。显式测试 key 以查看它是否为 null 并抛出所需的异常:

if (key == null) {
    throw new IllegalArgumentException("key is null");
}

我会让你找出放置此代码的最佳位置。


另一种方法是使 NullPointerException 成为预期的异常......但我对你的问题的解读是,该测试用例正在检查 要求 是否得到满足.