当前位置: 首页 > 知识库问答 >
问题:

Java 8-在lambda中抛出多个泛型检查异常

寿子默
2023-03-14

在我正在进行的一个项目中,我发现了一个类,它在一些复杂的异常处理中包装了它的超类的所有方法。看起来和那个差不多:

public void method1() throws ExceptionA {
    String exceptionString = "";
    try {
        super.method1();
    } catch (ExceptionA e) {
         exceptionString = // <convert the exception to string in an elaborate way>
         throw e;
    } finally {
         // <an elaborate logger call which uses value of exceptionString>
    }
}

public void method2() throws ExceptionB, ExceptionC {
    String exceptionString = "";
    try {
        super.method2();
    } catch (ExceptionB | ExceptionC e) {
         exceptionString = // <convert the exception to string in elaborate way>
         throw e;
    } finally {
         // <an elaborate logger call which uses value of exceptionString>
    }
}

// ... <a bunch of other methods like this>

我立即想到:“哇,怎么会有一个泛型包装器,然后在每个方法中调用它呢?这个类会短10倍!”。所以我得工作了。

private interface ThrowingMethod<E extends Exception> {
    void run() throws E;
}

public <E extends Exception> void wrapMethod(ThrowingMethod<E> method) throws E {
    String exceptionString = "";
    try {
        method.run();
    } catch (Exception e) {
         exceptionString = // <convert the exception to string in an elaborate way>
         throw e;
    } finally {
         // <an elaborate logger call which uses value of exceptionString>
    }
}

public void method1() throws ExceptionA {
    wrapMethod(super::method1); // works
}

public void method2() throws ExceptionB, ExceptionC {
    wrapMethod(super::method2); // Error in Eclipse: "Unhandled exception type Exception"
}

// ... <a bunch of other methods like this>

如何获得一个函数接口来处理多个泛型异常?

共有1个答案

常智勇
2023-03-14

当您扩展接口以使用两个类型变量时,即。

private static interface ThrowingMethod<E1 extends Exception,E2 extends Exception> {
    void run() throws E1, E2;
}

public <E1 extends Exception,E2 extends Exception>
void wrapMethod(ThrowingMethod<E1,E2> method) throws E1,E2 {
    // same as before
}

关于类型推断的规则不会改变,它们对于两个类型变量都是相同的。例如。您仍然可以使用

public void method1() throws ExceptionA {
    wrapMethod(super::method1);
}

如前所述,as编译器只是为两个类型变量推断相同的单个异常类型。

public void method2() throws ExceptionB, ExceptionC {
    wrapMethod((ThrowingMethod<ExceptionB, ExceptionC>)super::method2);
}

这是使用这种方法所能得到的最好结果。

 类似资料:
  • 我试图在lambda内部抛出一个异常,但它总是给我一个错误,表示未处理的IOException。 有人能告诉我我做错了什么吗?

  • 考虑下面的java代码片段: 这在Eclipse(Neon.2,JDK 8)中实现,Sonarint执行静态代码分析。它提供了重构的建议: 重构此方法以引发最多一个已检查异常,而不是:java。lang.InstanceionException,java。lang.IllegalAccessException 这项建议的基础是什么最佳做法?我知道一般来说对检查异常有一些争议,但是为什么在这种情况下

  • 我怎样才能用Java8做到这一点呢?

  • 我有下面的代码,这是有点难看的多个空检查。 所以我尝试使用,如下所示,但是如果有人阅读我的代码,仍然很难理解。 在Java9中,我们可以使用和,但是在Java8中还有其他方法吗?

  • 我需要从java调用scala代码,因此需要告诉编译器某个方法抛出某些异常。对于一个异常很容易做到这一点,但是我很难声明一个方法抛出多个异常。 这不起作用:

  • 问题内容: 包含多个有关将检查的异常与混合使用的问题。 虽然一些答案暗示使用其方法会导致难以阅读的用户代码。 我将使用此空间来提供可提高可读性的替代解决方案。 请注意,此问题特定于CompletableFuture。 这使我们能够提供更广泛地不扩展到lambda表达式的解决方案。 问题答案: 给定实用程序类(下面提供),用户可以无缝地抛出检查异常: 由lambda引发的任何异常(是否经过检查)都将