有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在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


共 (3) 个答案

  1. # 1 楼答案

    Lambda需要所有路径来返回前面答案中提到的值。简单的解决方案是在catch块的末尾返回

    然而,当使用lambda时,有一种更优雅的方法来处理异常

    你可以用另一个包裹一只羔羊 实例 包裹((x,y)->;x/y)

    Biconsumer<Integer,Integer> consumer wrap(Biconsumer<Integer,Integer> consumer)    
    {    
    return (v,k)->{try
    
    {consumer.apply()}
    
    catch(){};
    
    }
    

    https://www.youtube.com/watch?v=YLKMCPMLv60&list=PLqq-6Pq4lTTa9YGfyhyW2CqdtW9RtY-I3&index=18

  2. # 2 楼答案

    @FunctionalInterface
    public interface CreateThrowable<T, R, E extends Throwable> {
       R create(T t) throws E;
    static <T, R, E extends Throwable> Function<T, R> uncheckedException(ThrowingFunction<T, R, E> f) {
        return t -> {
            try {
                return f.create(t);
            } catch (Throwable e) {
                throw new RuntimeException(e);
            }
        };
    }
    

    }

  3. # 3 楼答案

    您的lambda需要返回一个MyObject。如果try块成功完成,情况就是这样,但是如果它没有成功完成,则执行catch块,该块不返回任何内容。所以你可以写:

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

    但随后您将得到另一个编译错误:“IOException从未在try块中抛出”。因此,您还需要在MyObject中有一个构造函数来抛出IOException

    class MyObject { MyObject() throws IOException {} }
    

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

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

    你也可以写:

    Creatable<MyObject> creator = MyObject::new;