相关疑难解决方法(0)

如何从Java 8流中抛出CHECKED异常?

如何从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 lambda checked-exceptions java-8 java-stream

270
推荐指数
10
解决办法
11万
查看次数

为什么我不能在Java 8 lambda表达式中抛出异常?

我升级到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)

java lambda exception java-8

30
推荐指数
2
解决办法
4万
查看次数