Java 为什么第二次从HashMap调用getValue()返回null?
我遇到了奇怪的行为。我在地图上有地图。在第二次映射迭代期间,我调用getValue()两次。第一次正确返回值,但第二次调用后getValue()总是返回null,为什么Java 为什么第二次从HashMap调用getValue()返回null?,java,hashmap,Java,Hashmap,我遇到了奇怪的行为。我在地图上有地图。在第二次映射迭代期间,我调用getValue()两次。第一次正确返回值,但第二次调用后getValue()总是返回null,为什么 Map<Integer, Map<Integer, String>> metricsColors = new HashMap<Integer, Map<Integer, String>>(); for (Entry<Affiliate, Map<Field, ApVal
Map<Integer, Map<Integer, String>> metricsColors = new HashMap<Integer, Map<Integer, String>>();
for (Entry<Affiliate, Map<Field, ApValue>> rowEntry : apValues.entrySet()) {
Map<Integer, String> metricColor = new HashMap<Integer, String>();
String finalMetricColor = null;
for (Entry<Field, ApValue> fieldValueEntry : rowEntry.getValue().entrySet()) {
if (fieldValueEntry.getKey().getType() == FieldType.CLASSIFICATION) {
metricColor.put(
fieldValueEntry.getKey().getMetrics().getId(),
fieldValueEntry.getValue().getValue()
); // HERE IS CORRECT.
if (fieldValueEntry.getKey().getForFinalClassification() != null && fieldValueEntry.getKey().getForFinalClassification() == true) {
finalMetricColor = fieldValueEntry.getValue().getValue(); // HERE IS A PROBLEM. Returns null always.
}
}
}
metricColor.put(2, finalMetricColor);
metricsColors.put(rowEntry.getKey().getId(), metricColor);
}
MapMetricsColor=newHashMap();
对于(条目行条目:apValues.entrySet()){
Map metricColor=new HashMap();
字符串finalMetricColor=null;
对于(Entry fieldValueEntry:rowEntry.getValue().entrySet()){
if(fieldValueEntry.getKey().getType()==FieldType.CLASSIFICATION){
metricColor.put(
fieldValueEntry.getKey().getMetrics().getId(),
fieldValueEntry.getValue().getValue()
)这里是正确的。
if(fieldValueEntry.getKey().getForFinalClassification()!=null和&fieldValueEntry.getKey().getForFinalClassification()=true){
finalMetricColor=fieldValueEntry.getValue().getValue();//这里有一个问题。总是返回null。
}
}
}
metricColor.put(2,finalMetricColor);
MetricsColor.put(rowEntry.getKey().getId(),metricColor);
}
为了澄清,我在这张地图中有3种类型的对象:附属对象、字段对象和ApValue对象。它们都实现了equals和hashCode方法
呼叫此线路时出现问题:
finalMetricColor=fieldValueEntry.getValue().getValue()代码>
它总是返回null,但是前面几行使用的相同调用可以正常工作,为什么?您需要使用fieldValueEntry.getValue().getValue()
,而不是fieldValueEntry.getApValue().getValue()
启动调试器或在代码中放入日志语句来查找。但是在你这么做之前,把这些陈述分开,以便看得更清楚。与此类似(SLF4J日志语法):
当然,您可以在第二种情况下重用第一个变量,但您需要知道为什么会出现这种行为。您就在这里:-)
我认为这不可能发生,因为您没有修改fieldValueEntry条目,所以在一种情况下,值怎么可能为null,在另一种情况下为non-null?你确定这种行为吗?在fieldValueEntry.getValue()上调用getValue()时,您是否遇到NullPointerException,或者是fieldValueEntry.getValue().getValue()返回null。在这种情况下,问题可能出在ApValue.getValue()方法中。它是否有使其值无效的副作用?据我所知,getApValue()不是Map.Entry.oops的方法,我的意思是另一种方法。。。比如@Bhesh Gurung说它是如何编译的?很抱歉,这是打字错误,我把getApValue()改成了getValue(),当然应该是。fieldValueEntry.getApValue()不应该编译,Map中没有这样的方法。Entryyes你说得对,当然没有getApValue(),但是getValue()。这是我在代码重构过程中犯的错误,只针对这个例子。现在代码应该是正确的并经过编译的。我认为这不会发生,您没有修改fieldValueEntry条目,那么在一种情况下,值怎么可能为null,在另一种情况下为non-null?你确定这种行为吗?在fieldValueEntry.getValue()上调用getValue()时,您是否遇到NullPointerException,或者是fieldValueEntry.getValue().getValue()返回null。在这种情况下,问题可能出在ApValue.getValue()方法中。它是否有使其价值无效的副作用?@avidD:我建议你重写此评论作为回答…:)fieldValueEntry.getValue()
具有类型ApValue
。向我们展示ApValue.getValue()
的实现。您是否确认了对metricColor.put()
的调用(您声称“工作正常”)并不仅仅是将空值放入该映射中?
for (...)
for (...)
if (...)
log.debug("fieldValueEntry: {}", fieldValueEntry);
ApValue apValue1 = fieldValueEntry.getValue();
log.debug("apValue1: {}", apValue1);
String value1 = apValue1.getValue(); // HERE IS CORRECT.
log.debug("value1: {}", value1);
metricColor.put(fieldValueEntry.getKey().getMetrics().getId(), value1);
if (fieldValueEntry.getKey().getForFinalClassification() != null && fieldValueEntry.getKey().getForFinalClassification() == true) {
ApValue apValue2 = fieldValueEntry.getValue();
log.debug("apValue2: {}", apValue2);
String value2 = apValue2.getValue(); // HERE IS A PROBLEM. Returns null always.
log.debug("value2: {}", value2);
finalMetricColor = value2;
}