在Java 8中使用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();

编译错误是:

不兼容的类型:lambda表达式中的错误返回类型

解决方法

你的lambda需要返回一个MyObject.如果try块成功完成就是这种情况,但如果不成功则执行catch块而不返回任何内容.所以你可以写:

Creatable<MyObject> creator = () ->  {
    try {
        return new MyObject();
    } catch (IOException e) {
        e.printstacktrace();
        return null;
    }
};

但是接下来你会得到另一个编译错误:“在try块中永远不会抛出IOException”.所以你还需要在MyObject中有一个抛出IOException的构造函数

class MyObject { MyObject() throws IOException {} }

最后,除非MyObject实际抛出异常,否则您可以简单地使用:

Creatable<MyObject> creator = () -> new MyObject();

你也可以写:

Creatable<MyObject> creator = MyObject::new;

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...