У меня есть метод, который принимает параметр java.util.Properties,
Мне нужно указать различные параметры, значение которых может быть нулевым.
Я получаю NullPointerException, потому что Hashtable.put не может получить нулевое значение
java.lang.NullPointerException
at java.util.Hashtable.put(Hashtable.java:460)
...
Я могу исправить это, используя метод проверки нулей:
private void putIfNotNull(Properties p, String name, String value) {
if (value!= null) {
p.put(name, value);
}
}
Или создайте класс-оболочку и используйте его:
public class PropertyHolder extends Properties {
@Override
public Object put( Object key, Object value ) {
if (value != null) {
return super.put(key, value);
}
return null;
}
и используйте его аналогично Property:
Properties p = new PropertyHolder();
Правильный ли второй вариант? или есть более простое / встроенное решение?
@JBNizet Но не вся реализация карты выдает исключение NullPointerException, поэтому разрешение отправки нулевых значений не всегда является ошибкой, я просто хочу игнорировать такие значения при использовании Properties
Что ж, если вы решили использовать свойства, зная, что он не может содержать нулевые значения, и вы все еще пытаетесь поместить в него нулевые значения, тогда это явно ошибка или плохой выбор дизайна для использования свойств. Таким образом, вы не должны принимать нулевое значение и молча игнорировать его, потому что оно указывает на ошибку.




Метод putIfNotNull - лучший вариант, потому что он ясно дает понять, что он не будет помещать значение, если оно равно нулю. Создание подкласса Properties, который молча отклоняет нулевые значения внутри метода put, означает нарушение ожидаемого поведения Maps - если put("key", value) возвращается без генерации исключения, то get ("key") должен вернуть тот же самый value.
Не могли бы вы пояснить, почему / есть ли другой вариант?
@ user7294900 Классы стандартной библиотеки Java имеют четко определенное поведение. Например, метод Map.put должен либо связать данный ключ с данным значением, либо завершиться ошибкой с исключением. И если Map.put(key, value) успешен, Map.containsKey(key) и Map.containsValue (value) должны вернуть true, а Map.get(key) должен вернуть value. Плохая практика - переопределять эти методы таким образом, чтобы нарушать их указанное поведение, поэтому второй вариант не рекомендуется. И, чтобы ответить на ваш другой вопрос, нет встроенного решения, и первый вариант самый простой.
Второй вариант правильный? Нет. Расширение коллекций - это почти всегда плохая идея. И есть несколько других способов добавить значения на карту, которые обойдут вашу проверку. Но самое главное, вы почти никогда не должны игнорировать недопустимый вызов метода и делать вид, что он действителен: установка нулевого значения - это ошибка, о которой следует сигнализировать, выбрасывая NullPointerException, и исправлять.