如何编写lambda表达式,在不使用try {} catch {}块的情况下重新检查已检查的异常?

时间:2015-10-21 16:40:51

标签: java exception lambda try-catch

我有一个lambda表达式,可以抛出IOException

    Function<String, List<String>> readFile = path-> {
        try {
            return Files.readAllLines(
                    Paths.get((String) path), Charset.forName("UTF-8"));
        } catch (IOException e) {
            return null;
        }
    };

我想在不使用try {} catch {}块的情况下编写相同的lambda表达式,以便将异常重新抛入封闭函数:

public static void main(String[] args) throws IOException {
    Function<String, List<String>> readFile = path-> {
        try {
            return Files.readAllLines(
                    Paths.get((String) path), Charset.forName("UTF-8"));
        } catch (IOException e) {
            return null;
        }
    };
}

唯一的问题是我无法定义自己的接口/类,我只能使用Java API提供的接口。

这可能吗?

2 个答案:

答案 0 :(得分:1)

如果要重新抛出例外,可以使用RuntimeException。 将它添加到你的捕获体。

throw new RuntimeException(e);

答案 1 :(得分:0)

由于.pdf_page_1 tr:nth-child(n+28) { display: none; } .pdf_page_2 tr:nth-child(-n+28) { display: none; } .pdf_page_2 tr:nth-child(n+56) { display: none; } .pdf_page_3 tr:nth-child(-n+56) { display: none; } .pdf_page_3 tr:nth-child(n+84) { display: none; } .pdf_page_4 tr:nth-child(-n+84) { display: none; } .pdf_page_4 tr:nth-child(n+112) { display: none; } #pdfPage tr:first-child { display: table-row !important; } 不会抛出已检查的异常,因此您无法执行此操作...

......以合法的方式。但是,你可以考虑&#34;偷偷摸摸&#34;如果你能承担风险

Function.apply

用法示例

interface FunctionX<T,R, X extends Exception> extends Function<T,R>
{
    R applyX(T t) throws X;

    @Override
    default R apply(T t)
    {
        try
        {
            return applyX(t);
        } 
        catch (Exception x)
        {
            throw Util.sneakyThrow(x);
        }
    }

    public static <T,R,X extends Exception> 
    FunctionX<T,R,X> of(FunctionX<T,R,X> f){ return f; }

}

// Util.java

public static RuntimeException sneakyThrow(Throwable t)
{
    throw Util.<RuntimeException>sneakyThrow0(t);
}
@SuppressWarnings("unchecked")
private static <T extends Throwable> T sneakyThrow0(Throwable t) throws T
{
    throw (T)t;
}