-1

我遇到了奇怪的行为。我在地图上有地图。在第二次地图迭代期间,我两次调用 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 但之前使用的几行相同的调用工作正常,为什么?

4

3 回答 3

0

你在这 :-)

我认为这不可能发生,您没有修改 fieldValueEntry 条目,那么如何在一种情况下为 null 而在另一种情况下为非 null 呢?您确定这种行为吗?在 fieldValueEntry.getValue() 上调用 getValue() 或 fieldValueEntry.getValue().getValue() 返回 null 时,您是否收到 NullPointerException。在这种情况下,问题可能出在 ApValue.getValue() 方法中。它是否具有抵消其价值的副作用?

于 2013-07-01T13:25:55.330 回答
-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; 
            }

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

于 2013-06-30T21:11:23.750 回答
-1

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

于 2013-06-30T09:45:53.657 回答