如何从Java 8流/ lambdas中抛出CHECKED异常?
换句话说,我想像这样编译代码:
public List<Class> getClasses() throws ClassNotFoundException {
List<Class> classes =
Stream.of("java.lang.Object", "java.lang.Integer", "java.lang.String")
.map(className -> Class.forName(className))
.collect(Collectors.toList());
return classes;
}
Run Code Online (Sandbox Code Playgroud)
此代码无法编译,因为Class.forName()
上面的方法抛出ClassNotFoundException
,检查.
请注意我不希望将已检查的异常包装在运行时异常中,而是抛出包装的未经检查的异常.我想抛出已检查的异常本身,而不是向流添加丑陋的try
/ catches
.
我升级到Java 8并试图用一个新的lamdba表达式替换一个简单的迭代迭代.循环搜索空值并在找到异常时抛出异常.旧的Java 7代码如下所示:
for (Map.Entry<String, String> entry : myMap.entrySet()) {
if(entry.getValue() == null) {
throw new MyException("Key '" + entry.getKey() + "' not found!");
}
}
Run Code Online (Sandbox Code Playgroud)
我将其转换为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!");
}
});
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释为什么throw
这里不允许的声明以及如何纠正这个问题?
Eclipse的快速修复建议看起来并不合适......它只是throw
用一个try-catch
块来围绕语句:
myMap.forEach((k,v) -> {
if(v == null) {
try {
throw new …
Run Code Online (Sandbox Code Playgroud)