调用抛出异常的方法的 Lambda return 方法

Lambda return method which calls method that throws exception

我有以下问题。 我在 method 1 中工作,这个 method 1 应该 return 某个 class 的对象。 对于我的 return 语句,我调用了另一个 method 2(当然 return 是所述 class 的一个对象)。尽管另一个 method 2 抛出异常。我应该如何在初始 method 1 中写下我的 return 语句?

像这样?

public class testClass {

    public testClass() {
    }

    public <T> T method1(parameter1, ...) {

     if(parameter1) {
      return () -> {
       try {
        method2(parameter1, parameter2...);
       } 
       catch (CloneNotSupportedException ex) {
        System.err.print("Error while cloning programmer");
       }
      };
    } else {
    return null;
    }
}

但我想如果我这样做只会 return 无效? 我应该把 return null 放在最后一个括号之后吗?或者我应该用完全不同的方式写这个吗?

编辑。你写了

Basically normally the exception should never be thrown

这是 RuntimeException 的完美用例。它基本上是一个透明的例外。您的代码的用户不会看到它,但当发生异常情况时,它会像野生口袋妖怪一样出现,并且会使您的应用程序停止,让您有机会修复它。

您的标准代码流不会受到影响,您将避免返回 null 值。


Lambda 表达式不允许抛出已检查的 Exceptions。
CloneNotSupportedException 扩展 Exception.

现在,你有两个选择

  • 就地处理 Exception,就像您所做的那样
  • 通过将 Exception 包裹在 RuntimeException
  • 中进行传播

return () -> {
    try {
       method2(parameter1, parameter2...);
    } catch (final CloneNotSupportedException e) {
       throw YourCustomRuntimeException("Error while cloning", e /* Original cause */);
    }
};

这取决于用例,但我认为 CloneNotSupportedException 表示错误 ,这对开发人员来说应该是显而易见的。所以让它浮出水面。

自定义 Exception 只需要扩展 RuntimeException,并且可能提供额外的字段来存储相关数据。

YourCustomRuntimeException extends RuntimeException { ... }

不要 扔底座 RuntimeException,使用自定义底座。