Java 从方法引用捕获异常

Java 从方法引用捕获异常,java,lambda,java-8,Java,Lambda,Java 8,我试图传递一个方法引用,该方法引用引发一个已检查的异常: Files.list((Paths.get("/some/path"))).map(Files::readAllLines); 如何处理此异常(无需将方法引用包装到处理exeption的方法中)。如果您试图捕获.map中特定值的异常,我不建议使用方法引用,而是使用lambda: Files.list((Paths.get("/some/path"))).map((someVal) -> { try { /

我试图传递一个方法引用,该方法引用引发一个已检查的异常:

Files.list((Paths.get("/some/path"))).map(Files::readAllLines);

如何处理此异常(无需将方法引用包装到处理exeption的方法中)。

如果您试图捕获
.map
中特定值的异常,我不建议使用方法引用,而是使用lambda:

Files.list((Paths.get("/some/path"))).map((someVal) -> {

    try {
        //do work with 'someVal'
    } catch (YourException ex) {
        //handle error
    }

});
如果要在之后重新显示异常,可以通过框中的错误引用手动执行此操作:

//using the exception itself
final Box<YourException> e = new Box<>();
Files.list((Paths.get("/some/path"))).map((someVal) -> {

    try {
        //do work with 'someVal'
    } catch (YourException ex) {
        //handle error
        e.setVar(ex);
    }

});
if (e.getVar() != null) {
    throw e.getVar();
}

class Box<T> {
    private T var;
    public void setVar(T var) { this.var = var; }
    public T getVar() { return this.var; }
}
//使用异常本身
最终框e=新框();
Files.list((path.get(“/some/path”)).map((someVal)->{
试一试{
//与“someVal”一起工作
}抓住(你的例外){
//处理错误
e、 setVar(ex);
}
});
如果(例如getVar()!=null){
抛出e.getVar();
}
类框{
私人T-var;
public void setVar(T var){this.var=var;}
public T getVar(){返回this.var;}
}

谢谢,很好用!但是除了建议之外-这里有没有捕获/重新抛出异常的方法?这取决于,如果您想在事件发生后重新抛出异常,那么您可以简单地使用
布尔值
触发在事件发生后抛出异常(因为抛出中间迭代将停止进程)。对不起,我不确定您是否理解正确。你能举个例子吗?我稍微改变了主意,你可以“缓存”最后抛出的异常,然后在需要时重新抛出它。我更新了我的答案来展示它。啊哼,你的第二个例子完全被打破了。这是一个基本原则,即不能使用lambda写入周围上下文的局部变量。您还记得,lambdas只捕获
final
变量还是“有效地
final
”变量?