Java 为什么第二次从HashMap调用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

我遇到了奇怪的行为。我在地图上有地图。在第二次映射迭代期间,我调用getValue()两次。第一次正确返回值,但第二次调用后getValue()总是返回null,为什么

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