#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
оператор для вызова anIllegalArgumentException
перед попыткой выполнения кодаkey.hashCode()
. Что в этом неочевидного?4. Перегрузка имени
Hashtable
, даже если оно находится в вашем собственном пакете, как правило, является плохой идеей ™.
Ответ №1:
ОК. Итак, этот Hashtable
класс является вашим кодом, а не java.util.Hashtable
. (Вы меня обманули на минуту …)
Решение простое. Явно протестируйте key
, чтобы убедиться, что это null
так, и выдайте требуемое исключение:
if (key == null) {
throw new IllegalArgumentException("key is null");
}
Я оставлю вас, чтобы выяснить, где лучше всего разместить этот код.
Другим подходом было бы создание NullPointerException
ожидаемого исключения… но я понимаю ваш вопрос так, что этот тестовый случай проверяет, выполнено ли требование.