Lambda返回方法,该方法调用引发异常的方法

时间:2019-03-15 19:22:36

标签: java exception methods return throw

我有以下问题。 我在method 1内工作,此method 1应该返回某个类的对象。 对于我的return语句,我调用另一个method 2(当然,它返回所述类的对象)。尽管其他method 2引发异常。我应该如何在我的初始method 1中写出退货声明?

喜欢吗?

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;
    }
}

但是我想如果这样做,它只会返回null吗? 我应该在最后一个括号之后放置return null吗?还是我应该用完全不同的方式写这个?

1 个答案:

答案 0 :(得分:4)

编辑。你写了

  

基本上通常不应该抛出异常

这是RuntimeException的完美用例。这基本上是一个透明的例外。您的代码的用户看不到它,但是当发生异常情况时,它看起来就像是一个疯狂的Pokemon,它将使您的应用程序停止运行,从而有机会对其进行修复。

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


Lambda 表达式不允许抛出选中的Exception
CloneNotSupportedException扩展了Exception

enter image description here

现在,您有两个选择

  • 像往常一样处理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,使用自定义的。