【发布时间】:2016-06-09 13:06:14
【问题描述】:
我升级到 Java 8 并尝试用新的 lamdba 表达式替换通过 Map 进行的简单迭代。循环搜索空值,如果找到则抛出异常。旧的 Java 7 代码如下所示:
for (Map.Entry<String, String> entry : myMap.entrySet()) {
if(entry.getValue() == null) {
throw new MyException("Key '" + entry.getKey() + "' not found!");
}
}
我尝试将其转换为 Java 8 如下所示:
myMap.forEach((k,v) -> {
if(v == null) {
// OK
System.out.println("Key '" + k+ "' not found!");
// NOK! Unhandled exception type!
throw new MyException("Key '" + k + "' not found!");
}
});
谁能解释为什么这里不允许使用 throw 语句以及如何纠正?
Eclipse 的快速修复建议在我看来不正确...它只是用 try-catch 块包围了 throw 语句:
myMap.forEach((k,v) -> {
if(v == null) {
try {
throw new MyException("Key '" + k + "' not found!");
}
catch (Exception e) {
e.printStackTrace();
}
}
});
【问题讨论】:
-
有一个非常简单的答案:lambda 表达式是实现函数式接口的一种简洁方式。就像实现接口的任何其他方式一样,您必须遵守接口协定——这意味着您只能抛出目标类型允许的异常。这里没有魔法。
标签: java exception lambda java-8