我遇到了奇怪的行为。我在地图上有地图。在第二次迭代映射期间,我调用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但是前面几行使用的同一个调用工作正常,为什么?
答案 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;
}
当然,你可以重用第二种情况中的第一个变量,但你会想知道为什么你会看到这种行为。