【问题标题】:How to use try catch in lambda expression (JAVA)?如何在 lambda 表达式(JAVA)中使用 try catch?
【发布时间】:2018-11-12 23:20:54
【问题描述】:

我必须使用 lambda 表达式。在这种情况下,try 块使用输入字符串创建了一个 JSON 对象。但我必须实现这一点,如果创建不起作用,它应该返回Optional.Empty() 而不是null。 我怎样才能做到这一点 ? 在当前情况下,工作流停止,直到捕获发生。所以其他字符串都被忽略了。

private Optional<JSONObject> testFile (Optional<String>  jsonFileContent)
{
    try
    {
        return jsonFileContent.map(fileContent -> new JSONObject(jsonFileContent)); // this lambda expression needs to be extended
    }
    catch(Exception e)
    {
        return null;
    }
}

【问题讨论】:

  • 永远不要从声明返回Optional的方法中返回null,而是返回Optional.empty()

标签: java class lambda expression optional


【解决方案1】:

这不是处理错误的好方法,因为:

  • 如果出现问题,您和调用您的代码的任何人都不会知道操作失败的原因。
  • 您会告诉最终用户什么? “出了点问题,但我们不知道是怎么回事,所以你无能为力,也不要费心告诉我们”?

如果您不确定处理异常的最佳方法,请不要捕获它。相反,声明你的方法来抛出它,并让准备处理它的调用者处理异常。例如,用户界面可能会捕获异常并将其一些详细信息提供给最终用户。

private Optional<JSONObject> testFile(Optional<String> jsonFileContent)
throws JSONException
{
    if (jsonFileContent.isPresent())
    {
        return Optional.of(new JSONObject(jsonFileContent.get()));
    }
    else
    {
        return Optional.empty();
    }
}

关于捕获异常的说明:

Java SE 中从 RuntimeException 派生的大多数类都是为了指示程序员错误。例如:

  • NullPointerException
  • IndexOutOfBoundsException
  • IllegalArgumentException

当这些发生时,它们表明您的程序逻辑已损坏。你不应该从他们身上恢复过来;您应该注意到它们并修复负责的代码。捕捉它们并抑制它们不会使您的程序正常工作。

永远不应捕获此类异常。这也意味着你永远不应该写catch (Exception …)catch (RuntimeException …)。如果你必须写一个catch 块,只捕获你绝对需要捕获的异常。

但更好的选择是不捕获任何东西并使用throws JSONException 声明您的方法。

【讨论】:

    【解决方案2】:
    private Optional<JSONObject> testFile (Optional<String>  jsonFileContent)
      {
           try{
                return jsonFileContent.map(fileContent -> a(fileContent));
            }
              catch(Exceptione)
    {
         return null;
    }
    Optional a(Optional<String> jsonFileContent) {
        try{
            return new JSONObject(jsonFileContent); // this lambda expression needs to be extended
        } catch (Exception e) {
            return Optional.empty();
        }
    }
    

    【讨论】:

      【解决方案3】:

      你可以编写一个方法来创建一个 新的 JSONObject(jsonFileContent)。

      你将在你的方法中使用 catch 包装逻辑,如果发生异常,将返回 null。

      实际上,在您调用 map 之后,您可以执行 filter 然后 findFirst 这是 null 并且 findFirst 返回 Optional 它 将根据需要返回一个空的 Optional。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-17
        • 1970-01-01
        • 1970-01-01
        • 2019-11-15
        • 2019-10-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多