在Java8中使用Lambda进行异常处理
我正在使用lambda表达式进行一些测试,但我的代码没有编译。我的lambda实现是错误的还是异常处理?以下代码的正确实现是什么
class MyObject { }
interface Creatable<T> {
T create() throws IOException;
}
/* Using the code: */
Creatable<MyObject> creator = () -> {
try {
return new MyObject();
} catch (IOException e) {
e.printStackTrace();
}
};
MyObject obj1 = creator.create();
如果我删除try-catch块并声明要在方法中抛出的异常,代码将正常编译和运行
Creatable<MyObject> creator = () -> new MyObject();
编译错误是:
incompatible types: bad return type in lambda expression
# 1 楼答案
Lambda需要所有路径来返回前面答案中提到的值。简单的解决方案是在catch块的末尾返回
然而,当使用lambda时,有一种更优雅的方法来处理异常
你可以用另一个包裹一只羔羊 实例 包裹((x,y)->;x/y)
https://www.youtube.com/watch?v=YLKMCPMLv60&list=PLqq-6Pq4lTTa9YGfyhyW2CqdtW9RtY-I3&index=18
# 2 楼答案
}
# 3 楼答案
您的lambda需要返回一个
MyObject
。如果try
块成功完成,情况就是这样,但是如果它没有成功完成,则执行catch
块,该块不返回任何内容。所以你可以写:但随后您将得到另一个编译错误:“IOException从未在try块中抛出”。因此,您还需要在
MyObject
中有一个构造函数来抛出IOException
:最后,除非
MyObject
实际抛出异常,否则您可以简单地使用:你也可以写: