Ответ 1
HashMap поддерживает обе клавиши null
и значения
http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html
... и разрешает нулевые значения и нулевой ключ
Итак, ваша проблема, вероятно, не сама карта.
Как вы передаете нулевые значения в HashMap?
Следующий фрагмент кода работает с параметрами, заполненными:
HashMap<String, String> options = new HashMap<String, String>();
options.put("name", "value");
Person person = sample.searchPerson(options);
System.out.println(Person.getResult().get(o).get(Id));
Итак, проблема заключается в том, что нужно вводить в параметры и/или метод для передачи нулевого значения?
Я пробовал следующий код без каких-либо успехов:
options.put(null, null);
Person person = sample.searchPerson(null);
options.put(" ", " ");
Person person = sample.searchPerson(null);
options.put("name", " ");
Person person = sample.searchPerson(null);
options.put();
Person person = sample.searchPerson();
HashMap поддерживает обе клавиши null
и значения
http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html
... и разрешает нулевые значения и нулевой ключ
Итак, ваша проблема, вероятно, не сама карта.
Вы можете учитывать следующие возможности:
null
.Однако с несколькими ключами и значениями null
он будет принимать только пару значений ключа .
Map<String, String> codes = new HashMap<String, String>();
codes.put(null, null);
codes.put(null,null);
codes.put("C1", "Acathan");
for(String key:codes.keySet()){
System.out.println(key);
System.out.println(codes.get(key));
}
вывод будет:
null //key of the 1st entry
null //value of 1st entry
C1
Acathan
null
только один разoptions.put(null, null);
Person person = sample.searchPerson(null);
Это зависит от реализации вашего метода searchPerson
если вы хотите, чтобы несколько значений были null
, вы можете реализовать соответственно
Map<String, String> codes = new HashMap<String, String>();
codes.put(null, null);
codes.put("X1",null);
codes.put("C1", "Acathan");
codes.put("S1",null);
for(String key:codes.keySet()){
System.out.println(key);
System.out.println(codes.get(key));
}
выход:
null
null
X1
null
S1
null
C1
Acathan
Кажется, вы пытаетесь вызвать метод с параметром Map. Таким образом, для вызова с именем пустого человека правильный подход должен быть
HashMap<String, String> options = new HashMap<String, String>();
options.put("name", null);
Person person = sample.searchPerson(options);
Или вы можете сделать это так:
HashMap<String, String> options = new HashMap<String, String>();
Person person = sample.searchPerson(options);
Использование
Person person = sample.searchPerson(null);
Может получить исключение нулевого указателя. Все зависит от реализации метода searchPerson().
Хорошая практика программирования для избегает наличия значений null
в Map.
Если у вас есть запись с null
значением, то невозможно определить, присутствует ли запись на карте или имеет значение null
, связанное с ней.
Вы можете определить константу для таких случаев (Пример: String NOT_VALID = "#NA"
), или вы можете иметь ключи хранения других коллекций, которые имеют значения null
.
Подробнее см. ссылку .
В соответствии с вашим первым программным snipet, кажется, хорошо, но у меня такое же поведение, вызванное плохой программированием. Вы проверили, что переменная "options" не имеет значения null до статического вызова?
Я использую Struts2 (2.3.3) webapp и использую HashMap для отображения результатов. Когда выполняется (в классе, инициализированном классом Action):
if(value != null) pdfMap.put("date",value.toString());
else pdfMap.put("date","");
Получена эта ошибка:
Struts Problem Report
Struts has detected an unhandled exception:
Messages:
File: aoc/psisclient/samples/PDFValidation.java
Line number: 155
Stacktraces
java.lang.NullPointerException
aoc.psisclient.samples.PDFValidation.getRevisionsDetail(PDFValidation.java:155)
aoc.action.signature.PDFUpload.execute(PDFUpload.java:66)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
...
Кажется, что NullPointerException указывает на метод put (строка номер 155), но проблема в том, что ранее карта не была инициализирована. Он скомпилирован нормально, поскольку переменная находится вне метода, который устанавливает значение.
вы можете сделать это вот так:
String k = null;
String v = null;
options.put(k,v);