我有两段代码,一段是用java旧式风格编写的,另一段是使用lambda表达式编写的,
第一:
Class enumClass = getConstantsEnum();
Object[] enumConstants = enumClass.getEnumConstants();
for(Object o:enumConstants) {
try {
constantsMap.put(o.toString(),o.getClass().getDeclaredField("lookupValue").getInt(o));
} catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException
| SecurityException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
工作正常,地图填写正确
其他的:
Class enumClass = getConstantsEnum();
Object[] enumConstants = enumClass.getEnumConstants();
constantsMap.putAll(Arrays.asList(enumConstants)
.stream().collect(Collectors.toMap
(e -> e.toString(), e -> {
try {
return e.getClass().getDeclaredField("lookupValue").getInt(e);
} catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException
| SecurityException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}finally {
return null;
}
}
)));
虽然通过调试该行,但给出了空指针异常
e.getClass().getDeclaredField("lookupValue").getInt(e)
我看到它被价值填满了
我的问题是:
1-这段代码有什么问题?
2-我如何在eclipse的流方法中有效地调试,有没有一种方法可以像正常循环一样看到元素在映射中逐一填充?我可以通过设置断点来查看第一个元素,但随后异常会立即触发
3-有没有更干净的方法来处理lambda表达式中的异常,我尝试用try/catch包装整个代码,但编译器仍然抱怨没有处理异常。
欢迎回答任何问题:)
编辑:
Q1由Holger在评论中回答
已添加IDE