我升级到 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 的快速修复建议对我来说看起来并不正确......它只是围绕throw
声明与try-catch
block:
myMap.forEach((k,v) -> {
if(v == null) {
try {
throw new MyException("Key '" + k + "' not found!");
}
catch (Exception e) {
e.printStackTrace();
}
}
});
不允许您抛出已检查的异常,因为accept(T t, U u) https://docs.oracle.com/javase/10/docs/api/java/util/function/BiConsumer.html#accept(T,U)方法中的java.util.function.BiConsumer<T, U> https://docs.oracle.com/javase/10/docs/api/java/util/function/BiConsumer.html接口中没有声明任何异常throws
条款。而且,如你所知,Map#forEach https://docs.oracle.com/javase/10/docs/api/java/util/Map.html#forEach(java.util.function.BiConsumer)采用这样的类型。
public interface Map<K, V> {
default void forEach(BiConsumer<? super K, ? super V> action) { ... }
} |
|
V
@FunctionalInterface
public interface BiConsumer<T, U> {
void accept(T t, U u); // <-- does throw nothing
}
当我们谈论检查异常时确实如此。但你仍然可以抛出未经检查的异常(例如java.lang.IllegalArgumentException https://docs.oracle.com/javase/10/docs/api/java/lang/IllegalArgumentException.html):
new HashMap<String, String>()
.forEach((a, b) -> { throw new IllegalArgumentException(); });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)