Как заставить хэш-таблицу выдавать исключение при вставке нулевого ключа (Java)?

#java #arrays #null #hashtable #illegalargumentexception

#java #массивы #null #хэш-таблица #исключение illegalargumentexception

Вопрос:

Для оценки мне нужно создать хэш-таблицу, что я и сделал. Однако мне нужно создать исключение при вставке нулевого ключа.

Тест, который я провел, который мне нужно пройти, был:

 @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  ;
    }
}
 

Я в полной растерянности из-за исключения исключения при вставке нулевого ключа. Я пробовал добавлять throw new IllegalArgumentException(); и другие подобные попытки внутри put , но я не могу заставить это работать.

У кого-нибудь есть какие-либо идеи или указания?

Комментарии:

1. Когда key значение равно null, выражение key.hashCode() будет выдавать NullPointerException , так почему вы ожидаете IllegalArgumentException ? — Скорректируйте свои ожидания , т.Е. Измените Свой тестовый код на @Test(expected = NullPointerException.class) .

2. «итак, почему вы ожидаете исключения IllegalArgumentException?». К сожалению, это не так. Это тест, который нам нужно пройти по нашему маркеру.

3.Затем добавьте if оператор для вызова an IllegalArgumentException перед попыткой выполнения кода key.hashCode() . Что в этом неочевидного?

4. Перегрузка имени Hashtable , даже если оно находится в вашем собственном пакете, как правило, является плохой идеей ™.

Ответ №1:

ОК. Итак, этот Hashtable класс является вашим кодом, а не java.util.Hashtable . (Вы меня обманули на минуту …)

Решение простое. Явно протестируйте key , чтобы убедиться, что это null так, и выдайте требуемое исключение:

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

Я оставлю вас, чтобы выяснить, где лучше всего разместить этот код.


Другим подходом было бы создание NullPointerException ожидаемого исключения… но я понимаю ваш вопрос так, что этот тестовый случай проверяет, выполнено ли требование.