【问题标题】:Lambda return method which calls method that throws exception调用引发异常的方法的 Lambda 返回方法
【发布时间】:2019-08-06 22:31:24
【问题描述】:

我有以下问题。 我在method 1 中工作,这个method 1 应该返回某个类的对象。 对于我的返回语句,我调用了另一个 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 放在最后一个括号之后吗?或者我应该以完全不同的方式写这个?

【问题讨论】:

  • 你好。看起来您在问题中编写的代码格式不正确。如果您的代码至少接近可运行,这将很有帮助(例如,您不必在所有方法中存根,但至少让其他人可以毫不费力地这样做)
  • 对method2 的调用可能会成功并可能引发异常,但无论如何它都会执行try 和catch 块之后的操作,即返回null。您可以根据需要对其进行修改。我没有你所有的代码,所以我不知道你想在那里做什么。向我们提供更多信息,以便我们进一步为您提供帮助。
  • 嗨,我已经更新了我的帖子。谢谢你的建议。基本上通常不应该抛出异常。我应该总是从方法 2 中获取该对象。我假设如果仍然抛出异常,我必须将 return null 放在我的括号中?

标签: java exception methods return throw


【解决方案1】:

编辑。你写的

通常情况下永远不应该抛出异常

这是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,使用自定义的。

【讨论】:

  • 您好,感谢您非常有用的回答。这解释了很多。通常这个异常永远不会发生,所以我真的没有任何用例,或者我真的没有编写代码以防它被抛出。你所说的'表示错误是什么意思,这对你来说应该是显而易见的。所以让它浮出水面。? “发出错误信号”是什么意思?并通过“让它浮出水面”?否则,我将使用您给我的内容并创建自己的异常类,它实现了 RunTimeException。
  • @SimonartM 我的意思是这种行为不是您所期望的,而且您显然无法从中恢复。 “让它浮出水面”意味着让你的应用程序基本上崩溃。这对你好吗?或者你想从这样的错误中恢复? (我不会)
猜你喜欢
  • 2020-11-07
  • 1970-01-01
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-10
  • 2014-03-01
  • 1970-01-01
相关资源
最近更新 更多