为什么从HashMap第二次调用getValue()会返回null?

时间:2013-06-30 09:38:31

标签: java hashmap

我遇到了奇怪的行为。我在地图上有地图。在第二次迭代映射期间,我调用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);
}

为了澄清我在这张地图中有3种类型的对象:Affiliate,Field和ApValue。所有都实现了equals和hashCode方法。

问题在于这一行:

finalMetricColor = fieldValueEntry.getValue().getValue();

它总是返回null但是前面几行使用的同一个调用工作正常,为什么?

3 个答案:

答案 0 :(得分:0)

你有: - )

我认为这不可能发生,你没有修改fieldValueEntry条目,那么在一种情况下如何将null值设为null而另一种情况下的值为null?你确定这个行为吗?在fieldValueEntry.getValue()上调用getValue()或者是fieldValueEntry.getValue()时,是否收到NullPointerException。getValue()returing null。在这种情况下,问题可能出在ApValue.getValue()方法中。它是否具有使其值无效的副作用?

答案 1 :(得分:-1)

您需要使用fieldValueEntry.getValue().getValue()而不是fieldValueEntry.getApValue().getValue()

答案 2 :(得分:-1)

启动调试器或在代码中放置日志语句以查找。但在你这样做之前,拆分语句以更清楚地看待事物。与此类似(SLF4J日志记录语法):

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

当然,你可以重用第二种情况中的第一个变量,但你会想知道为什么你会看到这种行为。