Japid:从HashMap获取键值时的奇怪行为

时间:2012-10-23 04:22:28

标签: java playframework-2.0 japid

<p> THAT'S OK: ${((Map<String,Integer>)view.get("upgrade_assignment_type_map")).toString()} </p>

<p> THAT'S ALSO OK:
for( String _name : ((Map<String, Integer>)view.get("upgrade_assignment_type_map")).keySet() ) {
<p> ${_name}: ${((Map<String, Integer>)view.get("upgrade_assignment_type_map")).get(_name)} </p>
}
</p>
<br><br>
<p> SADLY THAT'S NOT OK::: ${((Map<String, Integer>)view.get("upgrade_assignment_type_map")).get("MANUAL")} </p>

以上代码段打印以下输出,这对我来说很惊讶:

THAT'S OK: {AUTO_WITH_BALANCE_EMPHASIS=2, AUTO_WITH_OFFENSIVE_EMPHASIS=0, MANUAL=3, AUTO_WITH_DEFENSIVE_EMPHASIS=1}

THAT'S ALSO OK:

AUTO_WITH_BALANCE_EMPHASIS: 2

AUTO_WITH_OFFENSIVE_EMPHASIS: 0

MANUAL: 3

AUTO_WITH_DEFENSIVE_EMPHASIS: 1



SADLY THAT'S NOT OK:::

代码段的最后一行尝试获取键“MANUAL”的值,但它不打印该值,如果我尝试将其转换为toString(如${((Map<String, Integer>)view.get("upgrade_assignment_type_map")).get("MANUAL").toString()}),则在运行时将其赋予null。我不明白为什么会这样?

当我打印出每个键的长度(在第一个冒号<p> ${_name}: ${_name.length()} : ${((Map<String, Integer>)view.get("upgrade_assignment_type_map")).get(_name)} </p>之后)时:

AUTO_WITH_BALANCE_EMPHASIS: 29 : 2

AUTO_WITH_OFFENSIVE_EMPHASIS: 29 : 0

MANUAL: 10 : 3

AUTO_WITH_DEFENSIVE_EMPHASIS: 30 : 1

注意:我在java源代码中创建地图Map<String, Integer> nameToTypeMap = Maps.newHashMap();

2 个答案:

答案 0 :(得分:1)

我怀疑“MANUAL”条目中有一个不可打印的字符。改变你的一条工作线:

<p> KEY_LENGTHS:
for( String _name : ((Map<String, Integer>)view.get("upgrade_assignment_type_map")).keySet() ) {
<p> ${_name}: ${_name.length()}</p>
</p>

如果显示MANUAL的长度不是6,那表明我是对的,你应该查看你的数据源,找出额外角色的来源。

如果没有,我至少会尝试在外部调试HTML部分。我没有使用Play框架,但可能必须有一些代码填充这个视图...如果你可以在那里闯入调试器,它可能会使它更容易诊断。

另一种可能性是该条目包含一个非ASCII字符,其看起来像字符,但实际上并非如此。如果您查看HTML的来源,您可能会看到(并且可能甚至是不可打印的字符,具体取决于它的处理方式)。

答案 1 :(得分:0)

Eclipse没有显示无效字符,并且在这些字符串中存在无效字符(令人惊讶的可编译),所以当我在vim中打开该特定文件时,它会显示我并删除了这些无效字符。这解决了我的问题。